我有一个SQL Server存储过程,我可以运行(并从中获取输出),但是列中的一些返回为null。
我在控制器中使用的代码是:
Int32 Output7 = SPOutput.GetInt32(SPOutput.GetOrdinal("ptransient"));
ViewBag.Output7 = Output7;
但是当我运行代码时,我得到了
System.Data.SqlTypes.SqlNullValueException:'数据为空。无法在Null值上调用此方法或属性。'
来自“int32”行。
我尝试了Int32? Output7
等,但我得到了同样的错误。
我尝试使用if循环检查是否Output7.HasValue
,但在此之前发生异常。
我认为在将其分配给Int32 Output7变量之前我需要一种检查值的方法,但是我仍然坚持如何(仍然是较低级别noobie @ MVC)。
我用google搜索,看起来很糟糕(很糟糕),但无法找到解决方案。 有人能指出我应该做什么吗?
由于
答案 0 :(得分:1)
据推测,SPOutput.GetInt32()
正试图获得int
,而不是int?
。无论您将该操作的结果分配给什么,内部操作本身都会尝试生成int
。而且您无法从int
值生成null
。
在尝试之前检查数据库值是否为null
。也许类似的事情:
int? output7 = null;
if (SPOutput.GetValue(SPOutput.GetOrdinal("ptransient")) != DBNull.Value)
output7 = SPOutput.GetInt32(SPOutput.GetOrdinal("ptransient"));
这样,值默认为null
,但如果数据中存在整数值,则会从数据分配给整数值。
(请注意,这假设您的代码使用的是使用DBNull.Value
的相同数据访问技术,通常是普通的ADO.NET。)
答案 1 :(得分:0)
您检查SPOutput
或SPOutput.GetOrdinal("ptransient")
是否为空,如果没有,请尝试:
Int32 Output7;
if (SPOutput!= System.DBNull.Value && SPOutput.GetOrdinal("ptransient")!= System.DBNull.Value)
{
Output7 = SPOutput.GetInt32(SPOutput.GetOrdinal("ptransient"));
ViewBag.Output7 = Output7;
}
答案 2 :(得分:0)
解决此问题的最简单方法是根本不使用GetInt32,只需获取值的对象版本,然后使用as
进行投射,这将传递int值和DbNull
价值变得正常null
Int32? Output7 = SPOutput["ptransient"] as Int32?;
ViewBag.Output7 = Output7;