2013-08-26 41 views
0

我試圖處理DBNull的例外是這樣的:的ExecuteScalar如果DBNull的問題

string sql_com_sumcastka = "SELECT SUM(price) AS sumprice FROM kliplat WHERE akce='" + zakce.Text + "' AND year=" + year; 
      SqlCommand sc2 = new SqlCommand(sql_com_sumprice, spojeni); 
      spojeni.Open(); 

      if (sc2 != DBNull.Value) 
      { 
       int result = Convert.ToInt32(sc2.ExecuteScalar()); 
      } 
      else 
      { 
       int result = 0; 
      } 
      spojeni.Close(); 

      string sql_com_update_sum = "UPDATE zajezd SET [email protected]_prijmy WHERE akce='"+zakce.Text+"' AND year="+year; 
      SqlCommand sc3 = new SqlCommand(sql_com_update_sum,spojeni); 

      sc3.Parameters.AddWithValue("@s_prijmy", result); 
      spojeni.Open(); 
      sc3.ExecuteNonQuery(); 
      spojeni.Close(); 

但我不知道如何正確處理,如果結果爲DBNull我得到這個錯誤回報:Operator '"=' cannot be applied to operands of type system.Data.SqlClient.SqlCommand and System.Dbnull

名稱 '結果' 並不在當前的背景下存在

我的問題是這行代碼:

if (sc2 != DBNull.Value) 
     { 
      int result = Convert.ToInt32(sc2.ExecuteScalar()); 
     } 
     else 
     { 
      int result = 0; 
     } 

感謝您的幫助。

+0

爲什麼'sc2'是'DBNull.Value'?你剛分配給一個新的'SqlCommand'。你應該檢查'sc2.ExecuteScalar'是否是'DBNull.Value'。 –

回答

2

的ExecuteScalar不返回的DBNull,但空,你需要測試的ExecuteScalar的返回值不SqlCommand的執行命令

int sumOfPrice = 0; 
    object result = sc2.ExecuteScalar(); 
    if(result != null) 
     sumOfPrice = Convert.ToInt32(result); 

From MSDN

的ExecuteScalar返回第一行中的結果集 第一個列,或者如果結果集 爲空,則爲null引用(在Visual Basic中爲Nothing)。

請注意,不要使用字符串連接來構建傳遞到數據庫的命令文本。您冒着Sql注入和解析錯誤的風險。改爲使用參數化查詢這樣

string sql_com_sumcastka = "SELECT SUM(price) AS sumprice FROM kliplat " + 
          "WHERE [email protected] AND [email protected]"; 
SqlCommand sc2 = new SqlCommand(sql_com_sumprice, spojeni); 
sc2.Parameters.AddWithValue("@zak", zakce.Text); 
sc2.Parameters.AddWithValue("@year", year); 
+1

如果查詢的結果返回null,ExecuteScalar可能會返回'DBNull.Value',但是他的查詢永遠不會返回'DBNull.Value' –

+0

@ScottChamberlain您能詳細說明一個例子嗎?您的肯定似乎與文檔相矛盾 – Steve

+1

「* ExecuteScalar返回結果集中第一行的第一列*」如果結果集中第一行的第一列是SQL中的值NULL,則ExecuteScalar將返回'DBNull .Value'如果沒有行返回ExecuteScalar將返回'null'。此外,我收回我的聲明,SUM可以retun'NULL' [如果結果集中沒有行](http://sqlfiddle.com/#!3/e2487/1) –

0

A SqlCommand在您的示例中絕不能與DBNull.Value進行比較。這聽起來像你想要的是檢查你的執行標量調用的結果,看看是否爲空:

var result = sc2.ExecuteScalar(); 

if(result as DBNull == null) 
{ 
    // value is not null, do processing 
} 
1

這裏是正確的方式做到這一點

var objResult = sc2.ExecuteScalar(); 

if (objResult != DBNull.Value && objResult != null) 
{ 
    int result = (int)objResult; //you can just do a normal cast, "SUM(X)" returns a int. 
} 
else 
{ 
    int result = 0; 
} 
0

我知道答案是晚了,但是這是我發現的最簡單的答案

SELECT (SUM(price),0) FROM kliplat 

如果結果是null它將被替換爲0