您收到此错误是因为您不使用参数。
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 注入攻击。
例如,如果文本框 ID505 包含单引号,查询字符串中会发生什么情况?
此外,ExecuteScalar 返回一个对象
结果集中第一行的第一列,如果结果集为空,则为空引用(在 Visual Basic 中为 Nothing)
因此,最好在尝试将结果转换为整数之前检查 null。
编辑一段时间后回顾这个问题,我应该补充一点,在这种特殊情况下,来自 ExecuteScalar 的返回永远不会为空。之所以如此,是因为查询使用聚合函数 COUNT(*),即使在未找到记录的情况下也将始终返回一个有效数字。