none
Ошибки сохранения данных в БД RRS feed

  • Вопрос

  • Здравствуйте!

    Разрабатываю приложение в среде VS, язык С#, встраиваемая база данных Firebird Embedded.

    1) При сохранении данных в БД типа string возникает ошибка, если пользователь вводит в TextBox текст русскими буквами, то при сохранении данных в БД возникает сообщение об ошибке «Ошибка конвертирования текста команды в ib-charset [NONE]». Если текст введен латинскими буквами, то ошибок при сохранении и извлечении данных не возникает. Подскажите, пожалуйста, как работать с кириллицей при сохранении в БД?

    2) Также, если необходимо сохранить данные в поле типа float или numeric при сохранении возникает ошибка конвертирования из string.

    Ниже представлены 4 варианта сохранения числа. В 3-х случаях не удается сохранить число в БД.

    2.1) 1-й случай. Возникает ошибка.

    float price;
    price = Convert.ToSingle(textBox1.Text);
    cmd.CommandText = @"INSERT INTO ""TABLE1"" (""PRICE"") values(" + price + @")";
    

    2.2) 2-й случай. Возникает ошибка.

    //В этом случае ошибка возникает именно в момент сохранения в БД. В процессе конвертирования из string в float с помощью функции ToSingle() и дальнейших вычислений с переменной price ошибок не возникает.

    float price, price1;
    price = Convert.ToSingle(textBox1.Text);
    price1 = F4.2;
    price = 3*price + price1;
    cmd.CommandText = @"INSERT INTO ""TABLE1"" (""PRICE"") values(" + price + @")";
    

    2.3) 3-й случай. Возникает ошибка.

    //Разделитель между целой и дробной частью числа – запятая.

    string price;
    price = “15,75”;
    cmd.CommandText = @"INSERT INTO ""TABLE1"" (""PRICE"") values(" + price + @")";
    


    2.4) 4-й случай. Ошибки не возникает.

    //Разделитель между целой и дробной частью числа – точка.

     

    string price;
    price = “15.75”;
    cmd.CommandText = @"INSERT INTO ""TABLE1"" (""PRICE"") values(" + price + @")";
    

     

    Каким образом следует работать с полями типа float, numeric, decimal таким образом, чтобы брать введенные пользователем дробные числа (например, в данном случае стоимость, т.е. целая часть – рубли, дробная часть – копейки), производить с ними арифметические операции и сохранять в БД.

    Заранее спасибо всем ответившим.


    • Перемещено I.Vorontsov 12 января 2010 г. 7:45 (От:Visual C#)
    • Перемещено SachinW 1 октября 2010 г. 21:48 MSDN Forums Consolidation (От:Начинающие разработчики)
    4 января 2010 г. 17:23

Ответы

  • Во первый, передавать значения в тексте запроса категорически нельзя. Это не только вызывает проблемы с национальными форматами (например десятичными сепараторами, датами и т.п.), но и создает проблемы с безопасностью (известную как SQL Injection). Поэтому все значения должны передаватся в параметрах, а текст запроса должен содержать имена/индексы этих параметеров вместо самих значений. Это может так же улучшить производительность.

    Что до проблемы с русскими буквами то следует использовать тип данных который позволяет сохранять Unicode. Если Firebird не имеет такого типа то следует подумать о замене базы на другую.


    This posting is provided "AS IS" with no warranties, and confers no rights.
    • Помечено в качестве ответа I.Vorontsov 11 января 2010 г. 10:41
    4 января 2010 г. 20:45
    Модератор