2012-11-27 201 views
4

我有以下代碼:無法處理System.Data.SqlTypes.SqlNullValueException

public string getFinalCon(string desid) 
     { 
      string finalConId = null; 
      try 
      { 
       query = "select finalConID from discussions where [email protected]"; 
       com = new SqlCommand(query, con); 
       com.Parameters.AddWithValue("@did", desid); 
       con.Open(); 
       sdr = com.ExecuteReader(); 
       while (sdr.Read()) 
       { 
        if (sdr.GetString(0).Equals("none") == false && sdr.GetString(0)!=null) 
        { 
         finalConId = sdr.GetString(0); 
         break; 
        } 
       } 
       con.Close(); 
      } 
      catch (Exception) 
      { 
      } 
      return finalConId; 
     } 

正如你看到的,我捕捉「異常」,全局例外。但問題是,無論何時執行此行finalConId = sdr.GetString(0),系統都會拋出System.Data.SqlTypes.SqlNullValueException。是的,只要相應字段中的數據庫中存在NULL值,它肯定會拋出它。但是我想要的是這個異常應該被catch塊捕獲,並且函數應該返回在函數開始時聲明的NULL的默認值NULL。但是這並沒有發生,而是顯示了我的錯誤頁面。我打電話這樣的功能是這樣的:

string conid = getFinalCon(Request["id"].ToString()); 

if (conid == null) 
{ /*---some code---*/} 
else 
{/*---some code---*} 

請任何人告訴我如何處理這個異常。

回答

7

不要捕捉異常時你不需要。正確的方法是在致電sdr.GetString(0)之前測試sdr.IsDBNull(0)。如果IsDBNull()返回true,那麼GetString()將引發異常,您不應該調用它。

這也是很差的做法吞下所有異常而不指出某種錯誤。幾乎所有情況下都應避免使用catch { }catch (Exception) { }。如果發生災難性事件(例如數據庫連接斷開),您希望允許該異常傳播。否則,調用者如何區分「該列中的空值」和「數據庫連接已死」的情況?

+0

感謝它的工作和我想要的另一件事問。我們如何預測異常將會發生?由於這個原因,我使用Exception類來捕獲異常。我之前和你說過的一樣。但是,由於持續的例外,這讓我感到惱火,所以我只是去抓'Exception'異常。 –

+0

如果您收到異常,那麼您需要弄清楚原因。正如我所說的,忽略例外是非常糟糕的做法。一個例外需要被調查,而不是被忽略。 – cdhowie

2

與DBNull.Value或IsDBNull以便在()如果你想返回null它能夠更好地檢查值這樣

if (reader.IsDBNull(0) && sdr.GetString(0).Equals("none") == false) 
      //sdr.GetString(0)!=DBNull.Value) 

異常時做比這樣

string conid; 
try 
{ 
    conid = getFinalCon(Request["id"].ToString()); 
} 
Catch(Exception ex) 
{ 
    conid =null; 
} 
+0

以下錯誤遇到您嘗試您的代碼=>運算符'!='不能應用於類型'字符串'和'System.DBNull'的操作數 –

1

由於試圖從數據庫中讀取某些內容的程序是NULL,您將得到System.Data.SqlTypes.SqlNullValueException。您可以通過在讀取之前檢查該值是否爲NULL來解決此問題。

試試下面的代碼:

query = "select finalConID from discussions where [email protected]"; 
com = new SqlCommand(query, con); 
com.Parameters.AddWithValue("@did", desid); 
con.Open(); 
sdr = com.ExecuteReader(); 
while (sdr.Read()) 
{ 
    if (sdr.GetString(0).Equals("none") == false && !sdr.IsDBNull(0)) 
    { 
     finalConId = sdr.GetString(0); 
     break; 
    } 
} 
con.Close(); 
enter code here 

sdr.IsDBNull(0)會檢查,如果你想讀值爲NULL。這將修復你的錯誤:-)