2010-03-22 47 views
1

我瀏覽過S/O上的其他貼子,但找不到適用於我的解決方案。檢查數據讀取器中的記錄是否爲NULL

我有可能會返回一個空值DataReader的,如果是的話,我想慎重等於空白

txtMiddleName.Text = rdrGetUserInfo.GetString(1) ?? ""; 

上面的字符串不工作。 當我遍歷代碼時,代碼跳轉到我的錯誤捕獲塊;

任何想法?

+0

你會得到什麼異常? – SLaks 2010-03-22 14:49:29

+0

@ user279521 - 在調用getstring之前,您需要檢查IsDBNull。否則,你會得到一個空的異常拋出。看到我的答案如下:'txtMiddleName.Text = rdrGetUserInfo.IsDBNull(1)? String.Empty:rdrGetUserInfo.GetString(1);' – JonH 2010-03-22 14:57:14

回答

7

嘗試

txtMiddleName.Text = rdrGetUserInfo.IsDBNull(1) ? string.Empty : rdrGetUserInfo.GetString(1); 
+2

是我還是別人討厭「」,用String.Empty清理它。更多.net。 – JonH 2010-03-22 14:53:00

+0

完美的作品。還使用String.Empty(感謝JonH) – user279521 2010-03-22 15:03:44

1

這是因爲rdrGetUserInfo正在返回一個類的DBNull。

獲取字符串之前做了檢查的DBNull它像(被,因爲我用一個一會!):

if (!rdrGetUserInfo.IsDBNull("someField")) 
txtMiddleName.Text = rdrGetUserInfo.GetString(1); 
2

您可以在DataReader的使用IsDBNull method

if (!rdrGetUserInfo.IsDBNull(1)) 
{ 
    txtMiddleName.Text = rdrGetUserInfo.GetString(1); 
} 
1
If(rdr("Field") == DBNull.Value) 
    'assign String.Empty 
myString = string.Empty; 
else 
    'assign value 
    myString = rdr("Field"); 

或者縮短這個了,你可以這樣做:

txtMiddleName.Text = rdrGetUserInfo.IsDBNull(1) ? String.Empty : rdrGetUserInfo.GetString(1); 
0

IsDBNull以便(INT)通常要慢得多,使用像GetSqlInt32方法,然後比較DBNull.Value或使用它的自己。是空像:

​​

嘗試了幾個模板解決方案,但迄今爲止無濟於事。問題是,所有的Sql類型(SqlInt32這裏)類型實際上是結構,雖然他們都有.Value屬性C#沒有真正的模板來處理。他們也有自己的INullable接口,它只有.IsNull,並且與Nyllable <>不兼容。

我懷疑有人會需要全套Sql類型作爲C#模板或將ICOnvertible添加到它們以便能夠只有一個或兩個模板化方法。

如果有人有一個功能竅門或兩個說話的想法:-)

相關問題