3

У меня есть объект SqlCommand, который я использую для обновления таблицы базы данных, но он не интерпретирует мои нулевые значения правильно.Отправка нулевых параметров на сервер Sql

Вот SQL:

UPDATE dbo.tbl 
SET param1 = @param1, 
param2 = @param2, 
param3 = @param3, 
param4 = @param4, 
param5 = @param5, 
param6 = @param6, 
param7 = @param7, 
param8 = @param8, 
param9 = @param9, 
param10 = @param10 
WHERE param11 = @param11 

Я попытался неопределенные параметрами коалесцирующих, которые обнуляемые, как это, но я не имел никакого успеха. Если не указано иное, все параметры являются строками:

command.Parameters.AddWithValue("@param1", param1 ?? DBNull.Value); 
command.Parameters.AddWithValue("@param2", param2 ?? DBNull.Value); 
command.Parameters.AddWithValue("@param3", param3 ?? DBNull.Value); 
command.Parameters.AddWithValue("@param4", param4 ?? DBNull.Value); 
command.Parameters.AddWithValue("@param5", param5 ?? DBNull.Value); 
// param6 is nullable type DateTime? 
command.Parameters.AddWithValue("@param6", param6 ?? DBNull.Value); 
command.Parameters.AddWithValue("@param7", param7 ?? DBNull.Value); 
// param8 is nullable type DateTime? 
command.Parameters.AddWithValue("@param8", param8 ?? DBNull.Value); 
command.Parameters.AddWithValue("@param9", param9 ?? DBNull.Value); 
// param10 nullable type float? 
command.Parameters.AddWithValue("@param10", param10 ?? DBNull.Value); 
command.Parameters.AddWithValue("@param11", param11 ?? DBNull.Value); 

я получаю исключение, как это:

The parameterized query '(@param1 nvarchar(4000),@param2 nvarchar(4000),@param3 nvarc' expects the parameter '@param4', which was not supplied. 

Я также попытался пробегаем по каждому параметру после того как они были добавлены к объекту SqlCommand к установить DBNull.Value, если значение параметра равно нулю, как это:

foreach (SqlParameter parameter in command.Parameters) 
{ 
    if (parameter.Value == null) 
    { 
     parameter.Value = DBNull.Value; 
    } 
} 

Тем не менее, этот подход вызывает исключение:

String or binary data would be truncated. 
The statement has been terminated. 

Какова наилучшая практика передачи нулевых параметров в SqlCommand? Я просто не хочу передавать значения по умолчанию, если они равны нулю, поскольку схема базы данных допускает нулевые значения.

+1

какой тип 'param'? Вы знаете, что 'AddWithValue' должен вывести тип из переданного объекта? Поскольку вы не получаете ошибку времени компиляции, предположите, что 'param' - объект, который не является хорошей идеей. –

+0

DBNull - на самом деле лучшая практика (единственный способ) передать NULL для параметра. Вы уверены, что ошибка обрезания строки не вызвана чем-то другим? Передача NULL shoudln't вызывает эту ошибку ... Может быть, попытайтесь контролировать утверждение, которое получает excecuted в вашей БД и пытается идентифицировать «реальную» ошибку. – MichaC

+0

У меня есть 11 параметров, каждый из которых является строкой, DateTime или float , Я использовал общий параметр имени для маскировки бизнес-логики. –

ответ

22

Попробуйте это:

command.Parameters.AddWithValue("@param1", param1 ?? Convert.DBNull); 
+1

Что это за проблем?'Convert.DBNull' равно' DBNull.Value' –

3

привет попробуйте использовать следующий synatx:

command.parameters.add("@ParameterName",DBNull.value); 

надеюсь, что это помогает

+0

На самом деле это 'command.Parameters.Add (" @ ParameterName ", DBNull.Value) и метод' SqlCommand.Parameters.Add' устарели. Я null coalescing, потому что иногда значение не является нулевым, и я не хочу всегда передавать null. –

+0

Вы объявили параметр как NULL? –

+0

Большинство моих параметров являются строками и поэтому имеют значение NULL, но параметры, которые являются float и DateTimes, явно определены как NULL. –

0
commandObject.Parameters.AddWithValue("@parameterName",Convert.DBNull); 
Смежные вопросы