在单元测试中调试以下方法时,我收到以下错误
对象引用未设置为对象的实例
点击以下行
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;
}
答案 0 :(得分:11)
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();