Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么ExecuteScalar返回NullReferenceException错误_C#_Sql - Fatal编程技术网

C# 为什么ExecuteScalar返回NullReferenceException错误

C# 为什么ExecuteScalar返回NullReferenceException错误,c#,sql,C#,Sql,我有以下函数,用于检查某列的表中是否存在用户(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(

我有以下函数,用于检查某列的表中是否存在用户(
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()

出现以下错误:
对象引用未设置为对象的实例。

如何解决此问题?

根据MSDN():

结果集中第一行的第一列,如果结果集为空,则为空引用(在Visual Basic中为Nothing)


您正在对null对象调用.ToString()(为什么?),因为没有返回结果。跳过.ToString()调用,它应该可以正常工作。

如果
cmd.ExecuteScalar()
返回的
对象
null
,则会出现此异常。使用:

string value = System.Convert.ToString(cmd.ExecuteScalar());

如果需要将结果转换为
字符串

ExecuteScalar,则如果WHERE条件不产生任何结果,则返回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;
}
首先是t-sql函数,它是发现表中是否存在特定记录的最快方法。第二点是使用参数化查询来避免解析问题和Sql注入场景


IF EXISTS语句允许确保ExecuteScalar不返回null,因为在这种情况下,只要
cmd.ExecuteScalar()
返回null,ELSE部分就会返回零,然后
null.ToString()
抛出异常。 在您的情况下,只需使用teκnary运算符:

实施可以是

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; 
    }
  }
}

非常感谢。我为丢失的
编辑了您的代码。在这种情况下,不需要三元运算符,因此我删除了它。因此,如果用户在
Executive
列中不存在,则函数将返回0,否则将返回1?是的,很简单。如果存在,只需忽略第一部分(选择1…),并使用表名和where条件作为布尔表达式。如果结果为真,则执行括号外的第一个选择,否则执行第二个选择。好的,非常感谢。我意识到为什么参数对我不起作用。我忘记将其更改为
strU
:)如果
Executive
列中不存在该用户,我希望返回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; 
    }
  }
}