为什么ExecuteScalar返回NullReferenceException错误
我有以下函数检查列中是否存在用户( 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.
我该如何解决?
如果WHERE条件不产生任何结果,则ExecuteScalar返回null。
如果在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 Injection场景。
IF EXISTS语句允许确保ExecuteScalar不返回null,因为在这种情况下ELSE部分将返回零
根据MSDN( https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar ( v=vs.110 ) .aspx ):
结果集中第一行的第一列,如果结果集为空,则为空引用(在Visual Basic中为Nothing)。
你在null对象上调用.ToString()(为什么?),因为没有返回结果。 跳过.ToString()调用它应该可以正常工作。
每当cmd.ExecuteScalar()
返回null然后null.ToString()
抛出exception 。 在您的情况下,只需使用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; } } }
如果cmd.ExecuteScalar()
返回的object
为null
,则会出现此exception。 使用:
string value = System.Convert.ToString(cmd.ExecuteScalar());
如果您需要将结果转换为string
。
上述就是C#学习教程:为什么ExecuteScalar返回NullReferenceException错误分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/953747.html