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 шт):

Автор решения: MSDN.WhiteKnight

Это типичная ошибка, вызванная использованием 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);

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

→ Ссылка