[英]Check Int32 is Null
我有一个可以运行的SQL Server存储过程(并从中获取输出),但其中一些列返回为null。
我在控制器中使用的代码是:
Int32 Output7 = SPOutput.GetInt32(SPOutput.GetOrdinal("ptransient"));
ViewBag.Output7 = Output7;
但是当我运行代码时,我得到了
System.Data.SqlTypes.SqlNullValueException:'数据为空。 无法在Null值上调用此方法或属性。
从“ int32”行开始。
我尝试过Int32? Output7
Int32? Output7
等,但出现相同的错误。
我试过在if循环中检查是否Output7.HasValue
,但是在此之前发生异常。
我认为我需要一种在将值分配给Int32 Output7变量之前检查该值的方法,但是对于如何(仍然是较低级别的noobie @ MVC)感到困惑。
我已经用谷歌搜索,看起来好像很糟糕(问题很严重),但是找不到解决方案。 有人可以指出我应该怎么做吗?
谢谢
大概SPOutput.GetInt32()
试图获取一个int
,而不是一个int?
。 不管您要将该操作的结果分配给什么,该操作本身在内部都会尝试生成一个int
。 而且您不能从null
值产生一个int
。
尝试之前,请检查数据库值是否为null
。 也许与此类似:
int? output7 = null;
if (SPOutput.GetValue(SPOutput.GetOrdinal("ptransient")) != DBNull.Value)
output7 = SPOutput.GetInt32(SPOutput.GetOrdinal("ptransient"));
这样,该值默认为null
,但如果数据中存在整数值,则将其分配给数据中的整数值。
(请注意,这假设您的代码使用的是与DBNull.Value
相同的数据访问技术,通常是普通的ADO.NET。)
您是否检查SPOutput
或SPOutput.GetOrdinal("ptransient")
为null,如果不是,请尝试:
Int32 Output7;
if (SPOutput!= System.DBNull.Value && SPOutput.GetOrdinal("ptransient")!= System.DBNull.Value)
{
Output7 = SPOutput.GetInt32(SPOutput.GetOrdinal("ptransient"));
ViewBag.Output7 = Output7;
}
解决此问题的最简单方法是根本不使用GetInt32,而只是获取值的对象版本,然后使用as
,这将传递int值,而DbNull
值将变为普通null
Int32? Output7 = SPOutput["ptransient"] as Int32?;
ViewBag.Output7 = Output7;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.