2014-08-28 5 views
-1

У меня есть SqlParameter, содержащийся в var, возвращающемся из хранимой процедуры, и это значение равно Null, int или -1. Как сделать var для проверки, является ли это -1 в C#?SqlParameter Cast in C#

var p_eventID = new SqlParameter() 
{ 
    ParameterName = "@EventID", 
    Value = (eventID.HasValue 
     ? (object)eventID.Value 
     : (object)System.Data.SqlTypes.SqlInt32.Null), 
    Direction = ParameterDirection.InputOutput 
}; 

Я пробовал:

if ((int?)eventID.Value == -1) 

Но это дает мне недопустимую ошибку произнесения.

+1

Просьба указать код, на который вы выберете SqlParameter. Каков тип 'eventID'? –

+0

В какой базе данных ваша процедура? Различные базы данных возвращают разные типы. –

+0

Вы после [DBNull] (http://msdn.microsoft.com/en-us/library/system.dbnull%28v=vs.110%29.aspx) ?? –

ответ

3

Отчет о запросах SQL NULL s до C# через DBNull объекты, заставляющие литье терпеть неудачу.

Вы можете сделать другой вид броска к int?, не вызывая ошибку:

var eventIdInt = eventId as int?; 
if (eventIdInt == -1) { 
    ... 
} 

Вместо того, чтобы бросать исключение, x as type стиль броска будет производить значение null, когда бросок терпит неудачу.

+0

Вы не имеете в виду 'if (eventIdInt.HasValue && eventIdInt.Value == -1)'? Как было написано, он все равно может вызывать исключение NullReferenceException в выражении if. –

+0

@ErikPhilips Нет, вам не нужно проверять 'HasValue': сравнение будет успешным, если значение' -1', и оно не будет генерировать исключение, когда значение равно «null». – dasblinkenlight

+0

Червь магия! Вы правы, я всегда проверяю значение null для метания ошибок, поэтому этот код для меня обратный :) –

0

Ваш подход при возникновении ошибки приведет к ошибке Неверное исключение каста. Однако, если вы используете as int, если он терпит неудачу, он вернет нуль. Который будет немного более изящным и прощающим.

Таким образом, вы можете сделать следующее:

if(eventId != null) 
{ 
    // Do Stuff. 
} 

Так что возвращаемым значение из вашего скаляра, должны либо содержать фактическую int или null.

Для того, чтобы решить, почему вы получили сообщение об ошибке с (int), нам нужно будет увидеть, как вы реализуете скаляр и знаете тип object, который он фактически возвращает перед отливом.