好的,我创建了一个产品表 [ID, itemCode]、一个销售表和一个返回库存商品总和的 View 。问题是如果该项目尚未售出,则 View 中没有它的记录。
我需要检查商品是否有货,以完成进一步的销售等。
我所做的是这样的:
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' 是我的股票 View 中的第一个 itemCode,但它与我尝试插入的 itemCode 无关。
问题似乎在于:
object obj = com.ExecuteScalar();
我也尝试过
"SELECT COUNT(total) FROM [stock] WHERE ([itemCode] = " + TextBoxCode.Text + ")";
结果相同。我无法让它工作。
最佳答案
如果 ItemCode 不是数字,则需要在插入 TextBoxCode.Text 的代码之前和之后包含单引号。例子:
string selectSQL = "SELECT [total] FROM [stock] WHERE ([itemCode] = '" + TextBoxCode.Text + "')";
警告:使用此代码将使您对 SQL 注入(inject)攻击敞开大门!
使用参数的首选方法是:
string selectSQL = "SELECT [total] FROM [stock] WHERE ([itemCode] = @ItemCode)";
SqlCommand com = new SqlCommand(selectSQL, con);
com.Parameters.AddWithValue("@ItemCode", TextBoxCode.Text);
对于您的问题本身,如果结果集中没有行,则 ExecuteScalar 的结果将为 null(.NET null 条件)。这与结果集第一行的第一个字段是数据库 Null 值 (DBNull.Value) 时不同。
要检查两者,请使用:
if (obj == null || obj == DBNull.Value)
注意:您不需要第二次执行 ExecuteScalar(如果它不为空),因为您已经在 obj 变量中获得了结果。
关于c# - ASP .NET C# SQL 在 ExecuteScalar 上返回 DBNULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5378673/