2012-08-13 99 views
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轉換到其他類型的」如何處理Db.SingleDecimal中的null異常?

我該如何解決這個問題?

+1

什麼工具/庫是'SingleDecimal'方法?那是你自己的?要麼...?因爲需要在那裏做出改變。 – 2012-08-13 05:51:08

回答

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 
0

我沒有直接熟悉了SingleDecimal方法的任何工具,所以我在一般意義上回答如下:

從ADO.NET(直接或間接)查詢數據時,很可能(可能兩個)您都會得到某種「讀取器」API(很可能是IDataReader),或者你會得到原始的object值。

在第一種情況下,您應該可以訪問IsDBNull方法(每列);所以請調用該方法,並且做任何你想做的事情。

在第二種情況下,您應檢查DBNull的值,即if(val is DBNull)。

在這兩種情況下,代碼的下一步工作都取決於庫。在這兩種情況下,您都可能需要考慮兩個這裏爲null-esque場景:沒有行,並且有單個值的行。

坦率地說,在這兩種情況下,使用現有支持的庫/工具會更容易。例如,短小精悍,這也只是:

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

它給你:

  • 正確的參數設置
  • 空處理
  • 相同的API用於查詢的所有數據(Query<T>
  • 能夠使用任何您喜歡的LINQ的排名(Single()First()ToList()等)

如果你想使用一個默認值(而不是空decimal?當單元格的值是null,你可以只使用:

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

這裏要注意的?? 0M只是一個空合併操作得到一個零decimal代替null

0

我從我自己的問題找到了答案,嘿嘿。我使用在sql中選擇isnull((valuta),0),因此當結果爲DbNull時,它將替換爲0。

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

但是,如果你要採取一些行動時,結果是DBNull的(不僅設置默認值)也許ü可以嘗試二連Ersönmez的或者馬克Gravell的答案。 快樂編碼:D