singlepost

Преобразование типов (Access, ADO.NET, C#) << На главную или назад  

Используется Accessовская база данных, к которой подключились с помошью средств ADO NET.
Собственно вопрос, как мне в базу данных вставить данные из переменной типа doubl, если у нас тип дабл имеет вид 7.45, а Accessвская БД требует чтоб оно было вида 7,45, как правильно преобразовать?
И ещё, если у меня поле денежного формата, какой лучше всего тип данных использовать в C#, чтобы передавать значение???

заранее спасибо)

11 ответов в теме “Преобразование типов (Access, ADO.NET, C#)”

  1. 11
    Леонид Максимов ответил:

    а может быть следует иногда заглядывать в справку?
    //msdn.microsoft.com/en-us/library/ms136047.aspx
    прочитайте и поймете, что ожидает метод Add с одним аргументом.

    по поводу заключения цены в строку – это еще хуже, чем использование double (диапазон допустимых денежных значений сокращается еще больше).

  2. 10
    Максим Печерский ответил:

    Леонид 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… и как это реализовать??? чтот на ум не приходит…

  3. 9
    Андрей Батаков ответил:

    Чувак, нужно перевести цену в строку, и заменить там запятую на точку, так как запятая трактуется СУБД как разделитель поля. Или можно попробовать цену, поставить в опострофах ' ', в FireBird так срабатывает. А вообще вроде в C# можно строить запросы с помощью предварительно подготовки данных. Функция prepare или что то в этом роде. Если работал c FireBird, то поймешь

  4. 8
    Леонид Максимов ответил:

    кстати, использование double для денежных значений не является приемлемым с точки зрения точности – double, являясь шестидесятичетырехбитным числом с плавающей точкой, не может вместить без потерь весь диапазон денег (шестидесятичетырехбитного числа с фиксированной точкой) и хранит только 17 значащих цифр.

  5. 7
    Леонид Максимов ответил:

    и еще: можно не использовать параметризованные запросы, но в этом случае при преобразовании числа в строку вам потребуется указать формат в явном виде: //msdn.microsoft.com/en-us/library/fzeeb5cd.aspx

  6. 6
    Леонид Максимов ответил:

    замечания:
    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);

    да, и верните денежный тип на место.

  7. 5
    Максим Печерский ответил:

    Богушевич 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, у меня он был сначала денежным, но не добавлялась дробная часть, исправил на "Двойное с плавающей точкой"… всеравно не работает… уже даже мысль была вообще на текстовый исправить и добавлять туда строку… подскажите плиз, как правильнее реализовать.

  8. 4
    Леонид Максимов ответил:

    > double cena;
    > cena = Convert.ToDouble(addCenaCel.Text)+(Convert.ToDouble(addCenaDrob.Text)/100);

    омг. а в одно поле вводить никак? а если в addCenaDrob ввести число большее, чем 99? в общем, ужас.

    по делу: каким образом вы отправляете в акцесс?
    наверняка ведь исполняете запрос типа connection.Execute("insert tablename (цена) values (" + cena.ToString + ")");?

  9. 3
    Богушевич Максим ответил:

    #1 "тип дабл имеет вид 7.45, а Accessвская БД требует чтоб оно было вида 7,45"

    Ну запятая здесь точно не причем.
    А какая конкретно ошибка? В какой момент происходит? В момент записи в БД?

  10. 2
    Максим Печерский ответил:

    Леонид maxleo Максимов
    вот смотрите, у меня есть 2 поля: addCenaCel и addCenaDrob, в одно вводится целая часть, в другое дробная, далее я делаю в коде так:
    double cena;
    cena = Convert.ToDouble(addCenaCel.Text)+(Convert.ToDouble(addCenaDrob.Text)/100);

    и уже эту цену я отправляю в access и выходит ошибка

  11. 1
    Леонид Максимов ответил:

    омфг. access не требует такой фигни. видимо у вас где-то есть преобразование в строку и обратно.

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.