SqlCommand с параметрами, принимающими разные форматы данных - PullRequest
0 голосов
/ 06 июня 2019

Представьте себе этот код:

string value = "1.23";
string query = "UPDATE MYTABLE SET COL1=@p1";

SqlCommand cmd = new SqlCommand(query, connection);
cmd.Parameters.AddWithValue("@p1", value);

cmd.ExecuteNonQuery();

В моей базе данных он будет работать со значением = "1.23", если COL1 - столбец десятичного типа. Но он потерпит неудачу, если значение равно «1,23» (запятая вместо точки в качестве десятичной точки). Ошибка

Ошибка преобразования типа данных nvarchar в числовой

Я бы хотел, чтобы он работал в обоих случаях, когда "value" является строковой переменной.

К сожалению, я не могу просто заменить запятую на точку, так как этот код будет более универсальным, имея дело как с numeric, так и с varchar столбцами

Есть ли способ, чтобы запрос принял параметр с номером, записанным в виде строки, с точкой и запятой, и правильно поместил его в таблицу?

Спасибо за любую помощь

1 Ответ

3 голосов
/ 06 июня 2019

Если значение не является семантически строкой, вы не должны отправлять его как string. Тип значения параметра важен и влияет на способ его передачи , а может привести к проблемам с культурой (запятая против точки и т. Д.).

Если значение семантически является десятичным, используйте что-то вроде:

string value = "1.23";
var typedValue = decimal.Parse(value); // possible specifying a culture-info
//...
cmd.Parameters.AddWithValue("@p1", typedValue);

Тогда оно должно работать надежно.


Не связано, но вы можете сделать ADO.NET намного проще с помощью таких инструментов, как «Dapper»:

connection.Execute("UPDATE MYTABLE SET COL1=@typedValue", new { typedValue });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...