执行标量返回 null

Posted

技术标签:

【中文标题】执行标量返回 null【英文标题】:ExecuteScalar return null 【发布时间】:2019-01-29 19:49:46 【问题描述】:

我正在使用下面的 SQL Server 函数来检查用户通过 C# windows 窗体输入的 userNamepassword 是否正确,如下所示,但起初我在 cmd.ExecuteScalar(); 行出现错误说

"对象引用未设置为对象的实例。"

在尝试处理该错误后,我得到了错误

return result.ToString();

如果 SQL Server 函数不返回 null 值,如果数据库中没有匹配项,它返回 1 或 -1,我如何获取 null 值?

即便如此,我还是搜索并尝试处理从cmd.ExecuteScalar(); 返回的空值,您可以看到我的尝试,但没有一个成功

如果有人可以帮助我...谢谢

【问题讨论】:

@mjwills 抱歉更新我的问题,我在return result.ToString(); 上遇到错误 可能是因为您试图调用存储过程之类的函数?语句应该更像 'select dbo.USER_LOGIN(...)' Calling SQL Defined function in C#的可能重复 在您的代码中需要注意的一点是,即使经过非空检查,您仍然返回空结果...为什么? ExecuteScalar always returns null when calling a scalar-valued function的可能重复 【参考方案1】:

你可能想做这样的事情:

public string userLogin()

    string connStr = ConfigurationManager.ConnectionStrings["SRJDconnstr"].ToString();
    string cmdStr = @"SELECT dbo.USER_LOGIN(@USER_NAME, @PWD)";

    using (SqlConnection conn = new SqlConnection(connStr))
    using (SqlCommand cmd = new SqlCommand(cmdStr, conn))
    
            conn.Open();

            cmd.Parameters.AddWithValue("@USER_NAME", TB_USER_NAME.Text);
            cmd.Parameters.AddWithValue("@PWD", TB_PWD.Text);

            var result = cmd.ExecuteScalar();

            return result.ToString();
    

【讨论】:

@sam 你的查询应该是这样的 "SELECT dbo.USER_LOGIN (@USER_NAME, @PWD)" @IteratioN7T 谢谢你是对的,但这与 oracle 中的 oracle 语法完全不同,你只需使用 cmd.Parameters.add 传递 oracle 函数名,一切都会正常工作 @sam 对不起,我忘了括号 @sam 您使用的是 Oracle 还是 SQL Server?两者都是具有不同语法的两个不同的 DBMS。 ? 请将该行代码添加到您的答案cmd.CommandType = CommandType.Text; 所以我会将其标记为答案以及将来用于其他搜索者我使用cmd.Parameters.Add(new SqlParameter("@USER_NAME", SqlDbType.VarChar)).Value = TB_USER_NAME.Text;cmd.Parameters.Add(new SqlParameter("@PWD", SqlDbType.VarChar)).Value = TB_PWD.Text; 而不是AddWithValue搜索并发现它们之间没有区别,除了Parameters.Add 你必须注意数据类型和数据类型转换...如果我错了请纠正我谢谢大家的帮助【参考方案2】:

cmd.ExecuteScalar() 将返回结果集中第一行的第一列。

您的 SQL Server 函数代码以 RETURN @vResult 结尾,即 RETURN 值。

尝试将RETURN @vResult 替换为SELECT @vResult

【讨论】:

以上是关于执行标量返回 null的主要内容,如果未能解决你的问题,请参考以下文章

外部应用在不匹配时意外返回列NOT NULL

MSSQL 上标量 UDF 中的 NULL 参数

OracleCommand ExecuteScalar 有时返回 null

逐元素比较失败;返回标量,但将来将执行元素比较

不使用 numpy:FutureWarning:元素比较失败;而是返回标量,但将来将执行元素比较[关闭]

使用返回类型声明返回 NULL