繁体   English   中英

检查Int32是否为空

[英]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。)

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM