为什么ExecuteScalar返回NullReferenceException错误
本文关键字:错误 NullReferenceException 返回 ExecuteScalar 为什么 | 更新日期: 2023-09-27 18:25:23
我有以下函数,它检查一列的表中是否存在用户(strU
),如果是,则返回1,否则返回0:
public int AddDataScalar(string strU)
{
string strQueryExistence = "SELECT 1 FROM [OB].[h].[OP_PEONS] WHERE Executive= '" + strU + "'";
int inNum;
using (SqlConnection con = new SqlConnection(strConn))
{
con.Open();
SqlCommand cmd = new SqlCommand(strQueryExistence, con);
object value = cmd.ExecuteScalar().ToString();
if (value != null)
{
inNum = 1;
}
else
{
inNum = 0;
}
con.Close();
}
return inNum;
}
它在以下行失败:object value = cmd.ExecuteScalar().ToString();
出现以下错误:Object reference not set to an instance of an object.
我该如何解决?
如果在ExecuteScalar返回null时应用任何类型的转换,则会遇到麻烦。
话虽如此,我真的建议对您的查询进行一些更改
public int AddDataScalar(string strU)
{
string strQueryExistence = @"IF EXISTS(SELECT 1 FROM [OB].[h].[OP_PEONS]
WHERE Executive= @stru) SELECT 1 ELSE SELECT 0";
int inNum = 0;
using (SqlConnection con = new SqlConnection(strConn))
using ( SqlCommand cmd = new SqlCommand(strQueryExistence, con))
{
con.Open();
cmd.Parameters.AddWithValue("@stru", strU);
inNum = Convert.ToInt32(cmd.ExecuteScalar());
}
return inNum;
}
第一件事是IF EXISTS t-sql函数,它是发现表中是否存在特定记录的最快方法。第二点是使用参数化查询来避免解析问题和Sql注入场景。
IF EXISTS语句允许确保ExecuteScalar不会返回null,因为在这种情况下ELSE部分将返回零
每当cmd.ExecuteScalar()
返回null时,null.ToString()
就会抛出异常。在您的情况下,只需使用teκnary运算符:
inNum = cmd.ExecuteScalar() == null ? 0 : 1;
实现可以是
public int AddDataScalar(string strU) {
using (SqlConnection con = new SqlConnection(strConn)) {
con.Open();
// Make your SQL readable: use @"" strings
strQueryExistence =
@"SELECT 1
FROM [OB].[h].[OP_PEONS]
WHERE Executive = @prm_Executive";
// using is a better practice
using (SqlCommand cmd = new SqlCommand(strQueryExistence, con)) {
// parameters are better than hardcoding
cmd.Parameters.AddWithValue("@prm_Executive", strU);
return cmd.ExecuteScalar() == null ? 0 : 1;
}
}
}
根据MSDN(http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar(v=vs.110).aspx):
结果集中第一行的第一列,如果结果集为空,则为null引用(在Visual Basic中为Nothing)。
您正在对null对象调用.ToString()(为什么?),因为没有返回任何结果。跳过.ToString()调用,它应该可以正常工作。
如果cmd.ExecuteScalar()
返回的object
是null
,则会出现此异常。用途:
string value = System.Convert.ToString(cmd.ExecuteScalar());
如果您需要将结果转换为string
。