0
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 转换为其他类型”

我如何解决这个问题?

4

3 回答 3

0

我从我自己的问题中找到了答案,呵呵。我在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

于 2012-08-15T07:03:14.103 回答
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
于 2012-08-13T05:54:23.470 回答
0

我不直接熟悉任何带有SingleDecimal方法的工具,所以我将在一般意义上回答:

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

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

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

在这两种情况下,代码下一步做什么取决于库。在这两种情况下,您可能需要在这里考虑两个空场景:没有行,以及具有单个值的行。

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

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

这给了你:

  • 正确的参数化
  • 空值处理
  • 查询所有数据的同一个 API ( Query<T>)
  • 能够使用您喜欢的任何 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.

于 2012-08-13T05:57:21.927 回答