【问题标题】:how to handled null exception in Db.SingleDecimal?如何处理 Db.SingleDecimal 中的空异常?
【发布时间】:2012-08-15 15:03:14
【问题描述】:
c = new TableCell();
decimal pembayaran = Db.SingleDecimal("Select (valuta) from ArInvoice where customerID='01');
c.Text = Cf.Num(pembayaran);
c.Attributes["style"] = "text-align: right;";
tr.Cells.Add(c);

当查询有值时它可以工作,但是当结果为空时它包含这个错误 "对象不能从 DBNull 转换为其他类型"

我该如何解决这个问题?

【问题讨论】:

  • 使用SingleDecimal 方法的工具/库是什么?那是你自己的吗?或者...? '因为需要在那里进行更改。

标签: c# dbnull argumentnullexception


【解决方案1】:

问题在于以下方法调用:

Db.SingleDecimal("Select (valuta) from ArInvoice where customerID='01');

由于问题中没有提供方法定义,因此不确定它到底做了什么,但我猜它会尝试将 DBNull 值转换为另一种类型。您需要显示该方法的确切定义以获得更好的帮助,但您通常会使用以下方式处理 DBNull

var myDecimal = dr.IsDBNull(0) ? 0M : dr.GetDecimal(0); // get a decimal from the first column

【讨论】:

    【解决方案2】:

    我不直接熟悉任何带有SingleDecimal 方法的工具,所以我会笼统地回答:

    当从 ADO.NET(直接或间接)查询数据时,很可能(可能两者都有)您将获得某种“阅读器”API(很可能是IDataReader),或者您将获得原始的@ 987654323@ 值。

    在第一种情况下,您应该可以访问IsDBNull 方法(每列);所以调用那个方法,然后对 null 做任何你想做的事情。

    在第二种情况下,您应该检查DBNull 的值,即if(val is DBNull)。

    在这两种情况下,代码下一步做什么取决于库。在这两种情况下,您可能需要在这里考虑 两个 null 式场景:没有行,而行只有一个值。

    坦率地说,在这两种情况下,使用现有支持的库/工具会更容易。例如,使用 dapper,这将是:

    string customerId = "01";
    decimal? pembayaran = Db.Query<decimal?>(
        "Select valuta from ArInvoice where customerID=@customerId",
        new { customerId }).Single();
    

    给你:

    • 正确的参数化
    • 空值处理
    • 查询所有数据的 API 相同 (Query&lt;T&gt;)
    • 能够使用您喜欢的任何 LINQ 进行序数(Single()First()ToList() 等)

    如果您想使用默认值(而不是当单元格的值为 null 时为空的 decimal?,您可以使用:

    decimal pembayaran = Db.Query<decimal?>(
        "Select valuta from ArInvoice where customerID=@customerId",
        new { customerId }).Single() ?? 0M;
    

    请注意,?? 0M 只是一个空值合并操作,用于获取零 decimal 代替 null

    【讨论】:

      【解决方案3】:

      我从我自己的问题中找到了答案,呵呵。我在sql中使用了select isnull((valuta),0),所以当结果为DbNull时会用0代替。

      decimal pembayaran = Db.SingleDecimal("Select isnull((valuta),0) from ArInvoice where customerID='01');
      

      但是,如果您想在结果为 DbNull 时采取一些措施(不仅设置默认值),也许您可​​以尝试 Eren Ersönmez 或 Marc Gravell 的答案。 快乐编码:D

      【讨论】:

        猜你喜欢
        • 2019-09-06
        • 2014-12-12
        • 2010-11-25
        • 1970-01-01
        • 2013-03-31
        • 2011-06-05
        • 1970-01-01
        • 1970-01-01
        • 2021-11-08
        相关资源
        最近更新 更多