好的我已经创建了一个产品表[ID,itemCode],一个销售表和一个返回库存物品的SUM的视图。事情是,如果该物品尚未售出,则视图中没有该物品的记录。 我需要检查物品是否有库存才能完成进一步的销售等。
我所做的是:
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();
}
当物品实际存在于库存中时工作正常但如果没有记录我得到错误:
将nvarchar值'1E001'转换为数据类型int时转换失败。
'1E001'是我库存视图中的第一个itemCode,但它与我尝试插入的itemCode无关。
问题似乎在于:
object obj = com.ExecuteScalar();
我也试过了
"SELECT COUNT(total) FROM [stock] WHERE ([itemCode] = " + TextBoxCode.Text + ")";
具有相同的结果。我无法让它发挥作用。
答案 0 :(得分: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的结果将为null(.NET null条件)。这与结果集第一行的第一个字段是数据库空值(DBNull.Value)不同。
要检查两者,请使用:
if (obj == null || obj == DBNull.Value)
注意:你不应该第二次使用ExecuteScalar(如果它不是null),因为你已经在obj变量中得到了结果。
答案 1 :(得分:1)
尝试写下这样的if条件
if ((obj == null) || (obj == DBNull.Value))
答案 2 :(得分:0)
您的文字似乎需要单引号,如下所示:
"SELECT COUNT(total) FROM [stock] WHERE ([itemCode] = '" + TextBoxCode.Text + "')";