检查Int32是空的

时间:2017-09-23 15:33:32

标签: c# sql-server asp.net-mvc stored-procedures

我有一个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搜索,看起来很糟糕(很糟糕),但无法找到解决方案。 有人能指出我应该做什么吗?

由于

3 个答案:

答案 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)

您检查SPOutputSPOutput.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;