你得到這個錯誤是因爲你不使用參數。
string cmdStr = "SELECT COUNT(*) FROM Sale WHERE Date = @dt " +
"AND User = @usr " +
"AND Item = @itm " +
"AND Name = @name";
SqlCommand Pexist = new SqlCommand(cmdStr, myConnection3);
Pexist.Parameter.AddWithValue("@dt", DateTime.Today);
Pexist.Parameter.AddWithValue("@usr", UserBox.Text);
Pexist.Parameter.AddWithValue("@itm", ID505.Text);
Pexist.Parameter.AddWithValue("@name", DropDownList1.SelectedItem.ToString());
object result = Pexist.ExecuteScalar();
int P = (result == null ? 0 : Convert.ToInt32(result));
myConnection.Close();
當您使用參數時,您讓數據庫引擎處理您的輸入字符串。數據庫引擎知道如何處理日期,字符串和數字。你沒有解析問題,你可以避免Sql Injection Attacks.
例如,如果文本框ID505包含單引號,那麼在查詢字符串中會發生什麼?
此外,的ExecuteScalar返回一個對象,它是
The first column of the first row in the result set, or a null reference (Nothing in Visual Basic) if the result set is empty
所以最好嘗試的結果轉換成整數之前檢查空。
編輯經過一段時間回顧這個問題,我應該補充一點,在這種特殊情況下,ExecuteScalar的返回不能爲空。這是因爲查詢使用聚合函數COUNT(*),如果沒有找到記錄,它將始終返回一個有效數字。
SqlServer爲參數名使用不同的前綴。 @ – Steve
感謝您發現它 - 修復。 – Rashack