Используется Accessовская база данных, к которой подключились с помошью средств ADO NET.
Собственно вопрос, как мне в базу данных вставить данные из переменной типа doubl, если у нас тип дабл имеет вид 7.45, а Accessвская БД требует чтоб оно было вида 7,45, как правильно преобразовать?
И ещё, если у меня поле денежного формата, какой лучше всего тип данных использовать в C#, чтобы передавать значение???
заранее спасибо)
5 мая 2009 в 23:01
а может быть следует иногда заглядывать в справку?
//msdn.microsoft.com/en-us/library/ms136047.aspx
прочитайте и поймете, что ожидает метод Add с одним аргументом.
по поводу заключения цены в строку – это еще хуже, чем использование double (диапазон допустимых денежных значений сокращается еще больше).
5 мая 2009 в 1:03
Леонид maxleo Максимов
интересно, пробовал, игрался…. никак не выходит… что я тут неправильно пишу???
OleDbCommand add = new OleDbCommand("insert into cena_na_rashod values (?,?,?,?,?)", con);
add.Parameters.Add(addKodKanctov.Value);
add.Parameters.Add(addNazvKanctov.Text);
add.Parameters.Add(addFirmaKanctov.Text);
add.Parameters.Add(cena);
add.Parameters.Add(addEdinicaIzmKanctov.Text);
пишет: The OleDbParameterCollection only accepts non-null OleDbParameter type objects, not Decimal objects.
и так и сяк кручу, чтот не получается, я всё решил другим способом, но всё же интересен Вашь вариант, расскажите до конца его)
Андрей Fox_Moulder Б
ого, огромное спасибо)
OleDbCommand add = new OleDbCommand("INSERT INTO cena_na_rashod VALUES(" + addKodKanctov.Value + ",'" + addNazvKanctov.Text + "','" + addFirmaKanctov.Text + "','" + cena + "','" + addEdinicaIzmKanctov.Text + "')", con);
кавычки решили проблему)
Ещё ребята если не сложно… я начинающий программист, поэтому такой немного может Вам смешной вопрос… возможно ли… при открытиии форм, например Form1,Form2,Form3, выходя из Form1 закрыть за собой и Form2… и как это реализовать??? чтот на ум не приходит…
5 мая 2009 в 0:04
Чувак, нужно перевести цену в строку, и заменить там запятую на точку, так как запятая трактуется СУБД как разделитель поля. Или можно попробовать цену, поставить в опострофах ' ', в FireBird так срабатывает. А вообще вроде в C# можно строить запросы с помощью предварительно подготовки данных. Функция prepare или что то в этом роде. Если работал c FireBird, то поймешь
4 мая 2009 в 23:05
кстати, использование double для денежных значений не является приемлемым с точки зрения точности – double, являясь шестидесятичетырехбитным числом с плавающей точкой, не может вместить без потерь весь диапазон денег (шестидесятичетырехбитного числа с фиксированной точкой) и хранит только 17 значащих цифр.
4 мая 2009 в 23:05
и еще: можно не использовать параметризованные запросы, но в этом случае при преобразовании числа в строку вам потребуется указать формат в явном виде: //msdn.microsoft.com/en-us/library/fzeeb5cd.aspx
4 мая 2009 в 23:03
замечания:
Currency в Jet SQL (.mdb-файлы) – это специальный тип данных с фиксированной точкой (по сути – восьмибайтовое целое, 4 младших десятичных разряда которого считаются "стоящими после запятой"). то же самое, скорее всего, относится и к денежному типу в .NET.
далее, в выражении insert into имеет смысл перечислять поля:
insert into cena_na_rashod (Код, Наименование, Производитель, Цена, Единица_измерения) values (?, ?, ?, ?, ?)
о вашей ошибке:
следует учесть, что использование числовых типов в конкатенации вызывает их метод ToString, возвращающий строку, оформленную в соответствии с требованиями локали (в ru_RU разделителем целой и дробной частей как чисел, так и денег, является запятая). так что после конкатенации ваша строка выглядит так:
"INSERT INTO cena_na_rashod VALUES(12345,'Фломастер восьмикилограммовый','Faber Castel',4,50,'кор.')"
угадайте, что за два значения (4 и 50) стоят перед единицей измерения?
решение проблемы:
OLEDB предоставляет возможность использовать параметризированные запросы. т.е. в тексте запроса ставятся символы вопроса (неименованные параметры), в коллекцию Parameters добавляются следующие в нужной последовательности параметры, а OLEDB позаботится обо всем остальном.
предлагаю воспользоваться этой возможностью:
OleDbCommand add = new OleDbCommand("insert into cena_na_rashod values (?, ?, ?, ?, ?)", con);
add.Parameters.лень_смотреть_в_мсдн(addKodKanctov.Value);
add.Parameters.лень_смотреть_в_мсдн(addNazvKanctov.Text);
add.Parameters.лень_смотреть_в_мсдн(addFirmaKanctov.Text);
add.Parameters.лень_смотреть_в_мсдн(cena);
add.Parameters.лень_смотреть_в_мсдн(addEdinicaIzmKanctov.Text);
if (add.ExecuteNonQuery() == 1) MessageBox.Show("Сведения успешно добавлены.", "Добавление канцтовара.", MessageBoxButtons.OK);
да, и верните денежный тип на место.
4 мая 2009 в 11:00
Богушевич BOGa Максим
Леонид maxleo Максимов
в БД имеются поля: Код канцтовара, название, фирма поставщик, цена, еденица измерения.
Имеется форма для ввода, всё вводится нормально, только вот с этим денежным типом "цена" не могу разобраться, никогда не имел с ним дело… Если по сути, то подскажите как грамотно реализовать добавление в это поле данных, ато я уже итак и сяк пробую, если ввожу целое число всё работает нормально, но только когда ввожу дробное… сразу ошибка…
double cena;
cena = Convert.ToDouble(addCenaCel.Text)+(Convert.ToDouble(addCenaDrob.Text)/100);
OleDbCommand add = new OleDbCommand("INSERT INTO cena_na_rashod VALUES(" + addKodKanctov.Value + ",'" + addNazvKanctov.Text + "','" + addFirmaKanctov.Text + "'," + cena + ",'" + addEdinicaIzmKanctov.Text + "')", con);
if (add.ExecuteNonQuery() == 1) MessageBox.Show("Сведения успешно добавлены.", "Добавление канцтовара.", MessageBoxButtons.OK);
А ошибка вот такая выдаётся… "Не совпадает число значений запроса и число результирующих полей.", чтот я ничего не пойму… в чём ошибка???
И ещё подскажите, а как было бы грамотнее реализовать денежный тип в Accesse, у меня он был сначала денежным, но не добавлялась дробная часть, исправил на "Двойное с плавающей точкой"… всеравно не работает… уже даже мысль была вообще на текстовый исправить и добавлять туда строку… подскажите плиз, как правильнее реализовать.
4 мая 2009 в 7:05
> double cena;
> cena = Convert.ToDouble(addCenaCel.Text)+(Convert.ToDouble(addCenaDrob.Text)/100);
омг. а в одно поле вводить никак? а если в addCenaDrob ввести число большее, чем 99? в общем, ужас.
по делу: каким образом вы отправляете в акцесс?
наверняка ведь исполняете запрос типа connection.Execute("insert tablename (цена) values (" + cena.ToString + ")");?
4 мая 2009 в 5:04
#1 "тип дабл имеет вид 7.45, а Accessвская БД требует чтоб оно было вида 7,45"
Ну запятая здесь точно не причем.
А какая конкретно ошибка? В какой момент происходит? В момент записи в БД?
3 мая 2009 в 23:04
Леонид maxleo Максимов
вот смотрите, у меня есть 2 поля: addCenaCel и addCenaDrob, в одно вводится целая часть, в другое дробная, далее я делаю в коде так:
double cena;
cena = Convert.ToDouble(addCenaCel.Text)+(Convert.ToDouble(addCenaDrob.Text)/100);
и уже эту цену я отправляю в access и выходит ошибка
3 мая 2009 в 20:01
омфг. access не требует такой фигни. видимо у вас где-то есть преобразование в строку и обратно.