Как вставить двойные значения в MySQL из C# UWP - PullRequest
0 голосов
/ 28 мая 2020

Я пишу систему управления страхованием как проект в университете. Это моя MySQL команда:

 string lifeQuery = "insert into lifeinsurance values( null, '" + surname.Text + "." + pesel.Text + "', " + double.Parse(lifeInsSumTB.Text) + ", '" + double.Parse(lifeInsPriceTB.Text)
             + ");";

Но проблема в том, что в UWP double используется с ',', а для MySQL мне нужно иметь его с '.'. Когда я пытаюсь сделать это так: «25, 453», он говорит, что данные усечены. Без '', как этот 25 453, он говорит, что количество столбцов не соответствует количеству значений в строке 1, потому что оно представляет его как два разных значения 25 и 453. Итак, мой вопрос: как мне вставить это двойное значение в мою таблицу?

Ответы [ 2 ]

2 голосов
/ 28 мая 2020

Эта проблема вызвана неявным преобразованием в строку, когда вы вызываете double.Parse, а затем объединяете результат обратно в текст sql. Это требует, чтобы компилятор представил двойное значение в виде строки, и он будет использовать текущую культуру для выполнения преобразования. Конечно, результат не соответствует ожидаемому MySql двойному значению.
Более того, использование конкатенации строк для построения команд sql приводит к Sql взломам инъекции . Очень неприятная проблема, которой следует избегать. Всегда.

Итак, давайте попробуем добавить код для решения этих проблем

 // A parameterized string without any concatenation from user input
 string lifeQuery = @"insert into lifeinsurance 
        values( null, @surname, @sum, @price)";
 MySqlCommand cmd = new MySqlCommand(lifeQuery, connection);

 // Add the parameters with value for each placeholder in string
 cmd.Parameters.AddWithValue("@surname", surname.Text + "." + pesel.Text);

 // Parse the user input as a double using the current culture to correctly
 // interpret the comma as decimal separator.
 // Note that here I have no check on the correctness of the input. If your
 // user cannot be trusted to type a valid double number then you should use
 // the double.TryParse approach separating these lines from the actual check
 cmd.Parameters.AddWithValue("@sum", double.Parse(lifeInsSumTB.Text, CultureInfo.CurrentCulture));
 cmd.Parameters.AddWithValue("@price", double.Parse(lifeInsPriceTB.Text, CultureInfo.CurrentCulture));
 cmd.ExecuteNonQuery();
0 голосов
/ 28 мая 2020

Как и другие, есть более эффективные способы отправки данных с помощью Sql. При этом этот ответ фокусируется на решении вашей конкретной c проблемы.

Я думаю, что ваша проблема может быть в настройках вашего языка / культуры.

Попробуйте следующее:

Console.WriteLine(double.Parse("19.2323244").ToString("G", CultureInfo.InvariantCulture));

Выход:

19.2323244

https://docs.microsoft.com/en-us/dotnet/api/system.globalization.cultureinfo?view=netcore-3.1#Invariant

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...