【问题标题】:ExecuteScalar return null执行标量返回 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(); 返回的空值,您可以看到我的尝试,但没有一个成功

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

【问题讨论】:

标签: c# sql-server sql-server-2008 .net-4.0


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    相关资源
    最近更新 更多