ExecuteScalar调用抛出异常“对象引用未设置为对象的实例”

时间:2013-11-21 10:05:29

标签: c# database

在单元测试中调试以下方法时,我收到以下错误

  

对象引用未设置为对象的实例

点击以下行

result = (int)validateDatabase.ExecuteScalar();

方法是

    public static Boolean Validate(string argument1, string argument2)
    {            
        int result = -1;

        using (var connection = new SqlConnection("connection string"))
        {
            SqlCommand validateDatabase = new SqlCommand("PROCEDURE NAME", connection);
            validateDatabase.CommandType = System.Data.CommandType.StoredProcedure;
            validateDatabase.Parameters.Add("@PARAMETER1", System.Data.SqlDbType.NVarChar).Value = argument1;
            validateDatabase.Parameters.Add("@PARAMETER2", System.Data.SqlDbType.NVarChar).Value = argument2; 

            try
            {
                connection.Open();
                result = (int)validateDatabase.ExecuteScalar();
            }
            catch (SqlException exception) { Trace.WriteLine("exception.Message); }
            finally { connection.Close(); }
        }
        return (int)result == 0 ? true : false; 
    }

5 个答案:

答案 0 :(得分:11)

如果根据MSDN结果集为null,则

ExecuteScalar返回null。这意味着您的演员表无效

请参阅此处了解文档SqlCommand.ExecuteScalar

如果您希望该演员阵容发挥作用,请将其更改为可以为空的int

result = (int?)validateDatabase.ExecuteScalar();

答案 1 :(得分:5)

我刚遇到类似的问题。我所做的是从表中的特定记录中选择一个int列,但它发生在该列的值为0.执行以下操作导致异常“对象引用未设置为对象的实例”:

int i = (int)cmd.ExecuteScalar();

我的解决方案是将上面的代码更改为:

int i = 0;
object a = cmd.ExecuteScalar();
if (a != null)
   i = (int)a;

这避免了例外。

答案 2 :(得分:1)

ExecuteScalar:执行查询,并返回查询返回的结果集中第一行的第一列。其他列或行将被忽略。

尝试在查询末尾添加“ SELECT CAST(scope_identity()AS int)”。

答案 3 :(得分:0)

你做错了 - 尝试拨打SqlDataReader validateDatabase.ExecuteScalar()结果

答案 4 :(得分:-1)

result = validateDatabase.ExecuteScalar() == null ? -1 :
             (int)validateDatabase.ExecuteScalar();