Проблемы с конструктором SqlParameter и инициализатором объекта

Учитывая следующую строку кода:

cmd.Parameters.Add(new SqlParameter("@displayId", SqlDbType.NVarChar).Value = customer.DisplayID);

Я получаю следующую ошибку: SqlParameterCollection принимает только ненулевые объекты типа SqlParameter, а не объекты String.

Однако переписав его для использования инициализации объекта:

cmd.Parameters.Add(new SqlParameter("@displayId", SqlDbType.NVarChar) { Value = customer.DisplayID });

работает просто отлично. Любой указатель на то, почему это происходит?


person Pete Maroun    schedule 07.10.2011    source источник
comment
Возможно, это связано с тем, что customer.DisplayId имеет значение null, а SqlDbType.NVarChar не принимает нулевые значения.   -  person CharithJ    schedule 07.10.2011


Ответы (2)


Проблема заключается в неуместной закрывающей скобке:

cmd.Parameters.Add(new SqlParameter("@displayId", SqlDbType.NVarChar)).Value = customer.DisplayId;

Обратите внимание, что перед .Value стоят 2 закрывающие скобки. Как вы изначально ввели, вы делаете cmd.Parameters.Add(...);, где ...

new SqlParameter("@displayId", SqlDbType.NVarChar).Value = customer.DisplayId

и это оценивается как customer.DisplayId, следовательно, сообщение о том, что он не принимает типы string.

Кроме того, вы можете добавить параметр более кратко с помощью

cmd.Parameters.AddWithValue("@displayId", customer.DisplayId);

Что касается того, почему new SqlParameter("@displayId", SqlDbType.NVarChar).Value = customer.DisplayId возвращает customer.DisplayId, учтите, что оператор присваивания возвращает значение присваивается в качестве результата, и в данном случае это будет customer.DisplayId. Вот почему вы можете присвоить значение сразу нескольким переменным:

int i, j, k;
i = j = k = 42;
person Jeff Ogata    schedule 07.10.2011

cmd.Parameters.Add(new SqlParameter("@displayId", SqlDbType.NVarChar).Value = customer.DisplayID);

такой же как

var customerDisplayId = customer.DisplayID;
new SqlParameter("@displayId", SqlDbType.NVarChar).Value = customerDisplayId;
cmd.Parameters.Add(customerDisplayId);

теперь вы понимаете, почему компилятор жалуется?

person Bala R    schedule 07.10.2011