ASP .NET C#SQL在ExecuteScalar上返回DBNULL

时间:2011-03-21 14:02:18

标签: c# asp.net sql-server

好的我已经创建了一个产品表[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 + ")";

具有相同的结果。我无法让它发挥作用。

3 个答案:

答案 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 + "')";