【问题标题】:ASP .NET C# SQL return DBNULL on ExecuteScalarASP .NET C# SQL 在 ExecuteScalar 上返回 DBNULL
【发布时间】:2011-03-21 14:02:18
【问题描述】:

好的,我创建了一个产品表 [ID, itemCode]、一个销售表和一个返回库存商品总和的视图。问题是如果该项目尚未售出,则视图中没有它的记录。 我需要检查商品是否有货,以完成进一步的销售等。

我所做的是这样的:

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

结果相同。我无法让它工作。

【问题讨论】:

  • 顺便说一句,通过使用com.ExecuteScalar() 两次,您还执行了两次查询,而obj 应该已经包含了答案。
  • 你能发布你的视图代码吗?

标签: c# asp.net sql-server


【解决方案1】:

如果 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 条件)。这与结果集第一行的第一个字段是数据库 Null 值 (DBNull.Value) 时不同。

要同时检查两者,请使用:

if (obj == null || obj == DBNull.Value) 

注意:您不需要第二次执行 ExecuteScalar(如果它不为空),因为您已经在 obj 变量中获得了结果。

【讨论】:

  • 我实际上有参数,但为简洁起见,我没有发布整个内容
  • 我又完全错过了单引号。谢谢
【解决方案2】:

试着像这样写你的 if 条件

 if ((obj == null) || (obj == DBNull.Value)) 

【讨论】:

    【解决方案3】:

    看起来您需要像这样在文本周围加上单引号:

    "SELECT COUNT(total) FROM [stock] WHERE ([itemCode] = '" + TextBoxCode.Text + "')";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多