Отправка нулевых параметров на сервер Sql

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

Вот 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, если значение параметра равно null, например:

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? Я не просто хочу передавать значения по умолчанию, если они равны нулю, поскольку схема базы данных допускает нулевые значения.


person Cameron Tinker    schedule 23.09.2013    source источник
comment
Какой тип param? Вы знаете, что AddWithValue должен вывести тип из переданного объекта? Поскольку вы не получаете ошибку времени компиляции, предполагается, что param является объектом, что не является хорошей идеей.   -  person Tim Schmelter    schedule 23.09.2013
comment
DBNull на самом деле является лучшей практикой (единственным способом) для передачи NULL для параметра. Вы уверены, что ошибка усечения строки не вызвана чем-то другим? Передача NULL не должна вызывать эту ошибку... Возможно, попробуйте отследить оператор, который выполняется в вашей БД, и попытаться определить реальную ошибку.   -  person MichaC    schedule 23.09.2013
comment
Всего у меня 11 параметров, каждый из которых является строкой, DateTime или числом с плавающей запятой. Я использовал общий параметр имени, чтобы замаскировать бизнес-логику.   -  person Cameron Tinker    schedule 23.09.2013
comment
Не могли бы вы показать нам полный SQL?   -  person Ralf    schedule 23.09.2013
comment
Я обновлю вопрос в ближайшее время. Моя редакция почему-то не публикуется.   -  person Cameron Tinker    schedule 23.09.2013
comment
Я не совсем понимаю, почему я не мог опубликовать SQL в виде объединенной строки, но я обновил свой вопрос, чтобы показать полный SQL. Имена скорректированы на нераскрытие бизнес-логики.   -  person Cameron Tinker    schedule 23.09.2013
comment
Я просмотрел каждый из своих параметров и обнаружил, что один из них слишком велик, чтобы поместиться в один из столбцов, вызывающих исключение String or binary data would be truncated. The statement has been terminated.. Спасибо всем за помощь направить меня в правильном направлении.   -  person Cameron Tinker    schedule 24.09.2013
comment
Попробуйте это: command.Parameters.AddWithValue(@param1, param1 ?? Convert.DBNull);   -  person Gaurav123    schedule 11.02.2014


Ответы (2)


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

command.Parameters.AddWithValue("@param1", param1 ?? Convert.DBNull);
person Gaurav123    schedule 11.02.2014
comment
Что здесь исправить? Convert.DBNull равно DBNull.Value - person Nick N.; 01.08.2014

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

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

надеюсь это поможет

person Sai Avinash    schedule 23.09.2013
comment
На самом деле это будет command.Parameters.Add("@ParameterName", DBNull.Value), а метод SqlCommand.Parameters.Add устарел. Я объединяю null, потому что иногда значение не равно null, и я не хочу всегда передавать null. - person Cameron Tinker; 23.09.2013
comment
Вы объявили параметр как обнуляемый? - person Sai Avinash; 23.09.2013
comment
Большинство моих параметров являются строками и, следовательно, допускают значение NULL, но параметры с плавающей запятой и DateTimes были явно определены как допускающие значение NULL. - person Cameron Tinker; 23.09.2013