为什么ExecuteScalar返回NullReferenceException错误

时间:2014-10-01 14:29:29

标签: 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(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.

我该如何解决?

4 个答案:

答案 0 :(得分:2)

根据MSDN(http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar(v=vs.110).aspx):

  

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

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

答案 1 :(得分:2)

如果你的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部分将返回零

答案 2 :(得分:2)

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

答案 3 :(得分:1)

object返回的cmd.ExecuteScalar()null,您将收到此异常。使用:

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

如果您需要将结果转换为string