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

标签 c# asp.net sql-server

好的,我创建了一个产品表 [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/

相关文章:

c# - 将 Matlab Datenum 转换为 Datetime

c# - 在 C# 中遍历对象树

SQL/WINDOWS - 最佳字符长度 - 重要吗

sql-server - 使用 FOR XML AUTO 设置表变量输出的格式

sql-server - 了解 SQL Server 2008 安全、登录、角色等

c# - 使用 Entity Framework 从多个表中删除所有记录

java - 在java中用公钥加密,在C#中用私钥RSA解密

c# - 在 C# 中使用正则表达式删除 css 样式

c# - 在 IIS 上发布时出现 EmguCV 异常

javascript - 当我尝试获取特定 div 时,为什么我的 .load() 不起作用