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强制转换为其他类型”
我如何解决这个问题?
答案 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();
给你:
Query<T>
)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