如何在Db.SingleDecimal中处理null异常?

时间:2012-08-13 05:44:45

标签: c# dbnull argumentnullexception

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

它在查询有值时有效,但在结果为null时包含此错误 “无法将对象从DBNull强制转换为其他类型”

我如何解决这个问题?

3 个答案:

答案 0 :(得分:0)

问题在于以下方法调用:

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

答案 1 :(得分:0)

我并不是直接熟悉使用SingleDecimal方法的任何工具,所以我会在一般意义上回答:

当从ADO.NET(直接或间接)查询数据时,很可能(可能两者)你会获得某种“读者”API(很可能是IDataReader),或者你会得到原始object值。

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

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

在这两种情况下,代码接下来要做的就是库。在这两种情况下,您可能需要在此处考虑 两个 null-esque场景:没有行,以及具有单个值的行。

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

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

给你:

  • 正确参数化
  • null handling
  • 用于查询所有数据(Query<T>
  • 的相同API
  • 能够使用您喜欢的任何LINQ(Single()First()ToList()等)

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

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

此处请注意,?? 0M只是一个空合并操作,可以使decimal代替null

答案 2 :(得分:0)

我从自己的问题中找到答案,呵呵。我在sql中使用 select isnull((valuta),0),因此当结果为DbNull时,它将替换为0。

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

但是如果你想在结果是DbNull时采取一些行动(不仅设置默认值),也许你可以试试ErenErsönmez或Marc Gravell的答案。 快乐编码:D