System.Data.SqlClient.SqlException при добавлении FLOAT значения с дробной частью
Все привет, народ помогите плиз целый день мучаюсь.
значит есть такая вот таблица:
CREATE TABLE [dbo].[main] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[caller] INT NOT NULL,
[ceh] INT NULL,
[uch] INT NULL,
[brig] INT NULL,
[callee] INT NOT NULL,
[date_call] DATETIME NOT NULL,
[duration_call] INT NOT NULL,
[rate] FLOAT (53) NULL,
[limit] FLOAT (53) NULL,
[sum_m] FLOAT (53) NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);
при таком запросе в базу на добавление все работает корректно:
float a = 0;
float b = 2;
myCommand = new SqlCommand($"INSERT INTO dbo.main
(caller,callee,date_call,duration_call, rate, sum_m) VALUES " +
$"({each_off_Row[1]},
{each_off_Row[2]},'{each_off_Row[9]}','{each_off_Row[13]}',{a},
{b})", conn);
myReader = myCommand.ExecuteReader();
НО стоит передать в крайние два поля значения с дробной часть через {variable}
float a = 0.1f;
float b = 2.02f;
myCommand = new SqlCommand($"INSERT INTO
dbo.main (caller,callee,date_call,duration_call, rate, sum_m)
VALUES " +
$"({each_off_Row[1]},
{each_off_Row[2]},'{each_off_Row[9]}','{each_off_Row[13]}',{a},
{b})", conn);
myReader = myCommand.ExecuteReader();
и я получу следующее:
и мне абсолютно не понятно причем здесь ошибка не соответствия количества полей и значений
Ответы (1 шт):
Это типичная ошибка, вызванная использованием String.Format для вставки переменных в запрос. Код типа $"{a}" скомпилируется в String.Format("{0}",a.ToString()). Как правильно догадался Akina, преобразование float в string по умолчанию использует разделитель текущей локализации, поэтому на русской системе, где разделитель - запятая, он выдаст ошибку. Для правильной работы с переменными нужно использовать механизм параметров:
myCommand = new SqlCommand("INSERT INTO mytable (a,b) VALUES (@a,@b)", conn);
myCommand.Parameters.AddWithValue("a",a);
myCommand.Parameters.AddWithValue("b",b);
Помимо независимости от локализации, такой подход устраняет излишние операции соединения строк и преобразования чисел в строку на клиенте (ибо на сервере для вставки в базу все равно все должно быть разобрано до чисел).
