2014-08-28 60 views
-1

我有一个包含在从存储过程返回的var中的SqlParameter,其值为Null,一个int或-1。如何在var中检查它是否在C#中为-1?C#中的SqlParameter强制转换#

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'的类型? – 2014-08-28 16:29:52

+0

你的程序在哪个数据库中?不同的数据库返回不同类型 – 2014-08-28 16:31:20

+0

你在[DBNull]之后(http://msdn.microsoft.com/en-us/library/system.dbnull%28v=vs.110%29.aspx)? – 2014-08-28 16:31:23

回答

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)'?在写入时,它仍然可以在if语句上抛出NullReferenceException。 – 2014-08-28 16:33:39

+0

@ErikPhilips不,你不需要检查'HasValue':如果值为'-1',比较会成功,并且当值为'null'时不会抛出异常。 – dasblinkenlight 2014-08-28 16:35:14

+0

赚钱!你是对的,我总是检查是否为抛出错误,所以这段代码对我来说是倒退了:) – 2014-08-28 16:39:12

0

您的方法发生错误时,它会抛出一个无效铸造异常。但是,如果您使用as int(如果它失败),它将返回null。这会更加优雅,宽容。

所以,你可以做到以下几点:

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

所以,从你标返回的值,都应包含实际intnull

因此,为了解决为什么你收到(int)错误,我们需要看看你是如何实现标量的,并知道它在投射前实际返回的object的类型。