2010-06-30 2 views
3

У меня есть метод, который либо добавляет, либо обновляет запись в БД (SQL Server), и возвращает RecordID в качестве выходного параметра (Int32), а результат успеха/сбоя - как (Int32) Возвращаемое значение.Почему мне нужно указать значение возвращаемого значения для SQL-запроса?

Учитывая, что я указываю тип этих параметров, зачем мне их бросать, когда они возвращаются?

Я ожидал использовал следующее:

enquiryID = cmd.Parameters["@EnquiryID"].Value; 

... но я и до того, чтобы прыгать через пару дополнительных обручи:

enquiryID = Int32.Parse(cmd.Parameters["@EnquiryID"].Value.ToString()); 

Это не конец света, но это просто похоже на долговременное решение. Почему Parameters.Value возвращает объект SqlParameters.Value, а не Int32?

UPDATE:

ОК, я уверен, - прямое литье FTW: (int)cmd.Parameters["@EnquiryID"].Value

ответ

5

SQL Server не определяет тип данных, она возвращается, так что C# не имеет возможности определить тип перед обработкой Это. Кроме того, SqlParamater обобщен, так что он передает и объекту с SQL Server и обратно. SQL Server выполняет бросок на своем конце.

Кроме того, вместо использования Int32.Parse(cmd.Parameters["@EnquiryID"].Value.ToString()), если вы знаете, что его всегда будет int, вы можете просто сделать прямой листинг (int)cmd.Parameters["@EnquiryID"].Value. Если значение может быть возвращено в нуль, можно затем добавить

object value = cmd.Parameters["@EnquiryID"].Value; 
if(!value.Equals(DBNull.Value) 
    enquiryID = (int)value; 
+2

Это может оказаться предпочтительнее кучу если заявления 'INT значение = value.Equals (DBNull.Value)? null: (int) value' Вместо null вы также можете поместить значение по умолчанию –

+0

Re: sql server, выполняющий литье - Да, это имеет смысл. FYI, значение никогда не будет равно нулю, но проблема (и ваш пример) стоит отметить. Спасибо – CJM

+0

@Chris T: Я всегда забываю? оператора, так как я редко использую его, спасибо! –

2

Значение свойство объекта SqlParameter набирается в object, что означает, что он может возвращать любой заданный тип.

Ваш способ вернуть фактическое значение неверно, вам не следует преобразовывать строку в строку, чтобы проанализировать int32. Что в Собственость Value просто коробочная версия вашего значения, поэтому это должно быть достаточно:

enquiryID = (int)cmd.Parameters["@EnquiryID"].Value; 
+0

Мой путь на самом деле не «неправильный» как таковой - он работает, в конце концов, но да, метод прямого литья намного лучше. благодаря – CJM

Смежные вопросы