2011-03-21 58 views
1

OK我創建了一個產品表[ID,itemCode],一個銷售表和一個視圖,該視圖返回庫存物料的總和。如果該物品尚未售出,則視圖中沒有記錄。 我需要檢查,如果項目是在股票,以完成進一步的銷售等ASP .NET C#SQL在ExecuteScalar上返回DBNULL

我所做的是這樣的:

string selectSQL = "SELECT [total] FROM [stock] WHERE ([itemCode] = " + TextBoxCode.Text + ")"; 
    SqlConnection con = new SqlConnection(connectionString); 
    SqlCommand com = new SqlCommand(selectSQL, con); 
    try 
    { 
     con.Open();   
     object obj = com.ExecuteScalar(); 

     if (obj == null) //(also tried is DBNull) 
     { 
      lblStatus.Text = "Does not exist in stock"; 
     } 
     else 
     { 
      sum = com.ExecuteScalar().ToString(); 
      lblStatus.Text = "Items in stock: " + sum; 
     } 
    } 
    catch (Exception err) 
    { 
     lblStatus.Text = err.Message; 
    } 
    finally 
    { 
     con.Close(); 
    } 

它正常工作時,該項目在股票確實存在,但如果有沒有記錄我的錯誤:

Conversion failed when converting the nvarchar value '1E001' to data type int.

「1E001」在我的股票鑑於第一itemCode卻是風馬牛不相及的itemCode我想插入。

的問題似乎是在該行:

object obj = com.ExecuteScalar(); 

我也嘗試了

"SELECT COUNT(total) FROM [stock] WHERE ([itemCode] = " + TextBoxCode.Text + ")"; 

具有相同的結果。我無法讓它工作。

+0

順便說一句,通過兩次使用'com.ExecuteScalar()',你同時執行查詢兩次,而'obj'應該已經包含答案。 – 2011-03-21 14:26:11

+0

你能發表你的觀點代碼嗎? – jfollas 2011-03-21 14:45:45

+1

讓SQL注入飛行! – 2011-03-21 17:29:26

回答

8

如果ItemCode不是數字,那麼你就需要在插入TextBoxCode.Text的代碼之前和之後包含單引號。示例:

string selectSQL = "SELECT [total] FROM [stock] WHERE ([itemCode] = '" + TextBoxCode.Text + "')"; 

警告:使用此代碼會使您對SQL注入攻擊廣泛開放!

的優選方法,使用參數,將是:

string selectSQL = "SELECT [total] FROM [stock] WHERE ([itemCode] = @ItemCode)"; 
SqlCommand com = new SqlCommand(selectSQL, con); 
com.Parameters.AddWithValue("@ItemCode", TextBoxCode.Text); 

而對於你的問題本身的ExecuteScalar的結果將是空的(一個.NET空狀態),如果有在結果沒有行。這與結果集第一行的第一個字段是數據庫空值(DBNull.Value)的情況不同。

要同時檢查,使用方法:

if (obj == null || obj == DBNull.Value) 

注意:您不應該需要的ExecuteScalar第二次(因爲它不是空的情況下),因爲你已經有結果了obj變量。

+3

+1用於提示參數 – juharr 2011-03-21 14:14:51

+0

我實際上有參數,但我沒有發佈整個事情的簡潔 – user626873 2011-03-21 14:36:37

+0

我完全錯過了單引號。謝謝 – user626873 2011-03-21 14:46:04

0

它看起來像你需要在你的文本單引號,像這樣:

"SELECT COUNT(total) FROM [stock] WHERE ([itemCode] = '" + TextBoxCode.Text + "')"; 
1

嘗試寫你的,如果條件這樣

if ((obj == null) || (obj == DBNull.Value))