执行标量返回 null
Posted
技术标签:
【中文标题】执行标量返回 null【英文标题】:ExecuteScalar return null 【发布时间】:2019-01-29 19:49:46 【问题描述】:我正在使用下面的 SQL Server 函数来检查用户通过 C# windows 窗体输入的 userName
和 password
是否正确,如下所示,但起初我在 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的主要内容,如果未能解决你的问题,请参考以下文章
OracleCommand ExecuteScalar 有时返回 null