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

bea*_*ndo 12 c# database

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

你调用的对象是空的

当击中以下行时

result = (int)validateDatabase.ExecuteScalar();
Run Code Online (Sandbox Code Playgroud)

方法是

    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; 
    }
Run Code Online (Sandbox Code Playgroud)

Dav*_*ton 11

ExecuteScalar如果根据MSDN结果集为null,则返回null.这意味着您的演员表无效

有关文档SqlCommand.ExecuteScalar,请参见此处

如果你希望该转换工作,将其更改为可空 int

result = (int?)validateDatabase.ExecuteScalar();
Run Code Online (Sandbox Code Playgroud)


LaB*_*ird 5

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

int i = (int)cmd.ExecuteScalar();
Run Code Online (Sandbox Code Playgroud)

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

int i = 0;
object a = cmd.ExecuteScalar();
if (a != null)
   i = (int)a;
Run Code Online (Sandbox Code Playgroud)

这避免了例外.