【问题标题】:Check Int32 is Null检查 Int32 是否为空
【发布时间】:2017-09-23 15:33:32
【问题描述】:

我有一个可以运行的 SQL Server 存储过程(并从中获得输出),但有一些列返回为空。

我在控制器中使用的代码是:

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)。

我用谷歌搜索过,看起来是这样(可能很糟糕),但找不到解决方案。 有人能指出我应该做什么吗?

谢谢

【问题讨论】:

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


    【解决方案1】:

    大概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。)

    【讨论】:

    • HI,如果尝试这个是 get Hi,如果我尝试这个是 get " Operator '!=' cannot be applied to 'int' and 'DBNull' 类型的操作数以及
    • @GeraldOakham:啊,我明白为什么会这样了。自从我使用普通的旧 ADO.NET 以来已经有很长时间了。我已经通过另一次尝试更新了答案,试图从序数位置获取值。
    • 谢谢。这行得通,我把它改成了`int?输出8 =空; if (SPOutput.GetValue(SPOutput.GetOrdinal("pax_group")) != DBNull.Value) { Output8 = SPOutput.GetInt32(SPOutput.GetOrdinal("pax_group")); ViewBag.Output8 = 输出8; } 其他 { ViewBag.Output8 = 0; }`
    • 可以将if语句简化为if(!SPOutput.IsDbNull(SPOutput.GetOrdinal("ptransient")))
    【解决方案2】:

    你检查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;
    }
    

    【讨论】:

    • ,嗨,如果我尝试这是得到“运算符'!='不能应用于'int'和'DBNull'类型的操作数
    • 是的,我明白了,我想我的代码有些卡住了,所以你可以在为 Output7 设置值之前检查一下: if (SPOutput.GetValue(SPOutput.GetOrdinal("ptransient")) ! = DBNull.Value)
    【解决方案3】:

    解决这个问题的最简单方法是根本不使用 GetInt32,只需获取值的对象版本,然后使用 as 强制转换,这将传递 int 值和 DbNull 值变得正常 @987654323 @

    Int32? Output7 = SPOutput["ptransient"] as Int32?;
    ViewBag.Output7 = Output7;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-23
      • 2013-07-18
      • 2013-07-12
      • 2013-07-27
      • 2015-08-09
      • 2017-06-14
      相关资源
      最近更新 更多