2013-09-12 3 views
4

Я создаю/обновляю запись в sql db с хранимой процедурой. Я поставляю около 30 параметров с моего уровня доступа к данным C#. sql-таблица имеет все столбцы с нулевым значением, отличные от столбца первичного ключа. здесь, когда я поставлю нулевое значение в столбце с нулевым значением, он бросает исключение из «Процедура или функция» spFullUpdate 'ожидает параметр' @ App1TAPAYears ', который не был указан. ". В моем коде C# я ясно вижу, что столбец снабжен нулевым значением. Может ли кто-нибудь сказать мне, как я могу исправить эту проблему. Ниже приводится мой фрагмент кода. Установленное значение для объекта данных, как следоватьПроцедура или функция ожидает параметр, который не был указан. Исключение исключения столбца с нулевым значением

Dt.TimeAtPreviousAddressYears = int.TryParse(TimeatPreviousAddressYears.Text, out intOut) ? intOut : (int?)null; 

Ниже в обнуляемого собственности в моем классе сущностей

 public int? TimeAtPreviousAddressYears { get; set; } 

Мой уровень доступа к данным, добавив код параметра, как следовать

cmd.Parameters.Add("@App1TAPAYears", SqlDbType.Int).Value = dataObject.TimeAtPreviousAddressYears; 
SqlDataAdapter da = new SqlDataAdapter(cmd); 
       conn.Open(); 
       cmd.ExecuteNonQuery(); 

Ясно видно, что параметр добавлен, а нулевое значение передается в столбец с нулевым значением, но он все еще создает исключение. Любая помощь будет действительно оценена.

Добрые Regardds

+0

Пожалуйста, покажите код, где вы добавить все параметры, пока вы выполнить SP. (Редактировать сообщение) – Heslacher

+0

код в порядке, так как он не создает исключения, когда я поставлю значение этого параметра. Исключение возникает только тогда, когда значение равно null. –

+0

просто хотел быть уверенным. Увидели много вопросов о не заданном параметре, который был вызван созданием объекта команды еще раз перед запросом. – Heslacher

ответ

14

nullable != DBNull.Value

Таким образом, вы не можете передать (int?)null к значению параметра, но вместо того, чтобы пройти DBNull.Value

Как:

if (dataObject.TimeAtPreviousAddressYears.HasValue) 
{ 
    cmd.Parameters.Add("@App1TAPAYears", SqlDbType.Int).Value =dataObject.TimeAtPreviousAddressYears; 
}else 
{ 
    cmd.Parameters.Add("@App1TAPAYears", SqlDbType.Int).Value = DBNull.Value; 
} 
+0

Я получаю сообщение об ошибке «Тип условного выражения не может быть определен, потому что нет никакого неявного преобразования между 'int?' и 'System.DBNull' –

+0

Итак, этот 'shortcircuit' или, однако, это присвоение называется won't work в этом случае, поэтому вам нужно использовать классический if else. Обновлен мой ответ. – Heslacher

+0

Спасибо, что отлично работает сейчас.Очень ценю вашу помощь. –

0

Вы должны попробовать с

if (dataObject.TimeAtPreviousAddressYears.HasValue) 
{ 
    cmd.Parameters.Add("@App1TAPAYears", SqlDbType.Int).Value =dataObject.TimeAtPreviousAddressYears; 
}else 
{ 
    cmd.Parameters.Add("@App1TAPAYears", SqlDbType.Int).Value = (object)DBNull.Value; 
} 

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

2

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

я остановился на добавлении это в моем RepositoryBase классе

protected object ValueOrNull(object value) 
    { 
     return value ?? DBNull.Value; 
    } 

и это это в моем фактическом коде репо для каких-либо дополнительных элементов

cmd.Parameters.Add(new SqlParameter("@VoucherCode", SqlDbType.VarChar)).Value = ValueOrNull(promo.VoucherCode); 
Смежные вопросы