我在发布这个问题之前做了一些研究,我知道当没有数据返回时,ExecuteScalar会抛出一个System.NullReferenceException。这就是为什么我将我的存储过程修改为“返回1”,因此保证了返回值。但是,我仍然得到NULL引用异常。
所以我尝试使用SqlCommand查询包含数据的表:
SqlCommand sqlCommand = new SqlCommand("SELECT * FROM ATableThatHasValues", conn)
当我运行执行标量时,我能够获取一个值,因此我知道我有权查询数据库。我怀疑这是一些我错过的特定存储过程权限设置?
我非常感谢任何评论/建议,因为我现在已经坚持了一天。 :(
我的代码如下所示:
using (SqlConnection sqlConnection = new SqlConnection(connectionString))
{
sqlConnection.Open();
using (SqlCommand sqlCommand = new SqlCommand("GetSomeValue", sqlConnection))
{
sqlCommand.CommandType = CommandType.StoredProcedure;
//sqlCommand.Parameters.Add(new SqlParameter("@Id", this.ID));
//sqlCommand.Parameters.Add(new SqlParameter("@State", 1 /* active */));
byte retValue = (byte)sqlCommand.ExecuteScalar();
return retValue;
}
}
谢谢!
答案 0 :(得分:3)
我将详细阐述@gbn所说的内容。执行SQL代码时,您可以通过三种不同的方式返回信息:OUTPUT
参数,表格数据和/或单个RETURN
值。就像@gbn所说,RETURN
值基本上是专门的OUTPUT
参数。 ExecuteScalar
仅查看表格数据中的信息,即第一行的第一列。如果在调用ExecuteScalar
时未收到表格数据,则返回空值。如果您尝试使用此null值执行某些操作,那么显然您将获得NRE。
答案 1 :(得分:2)
随机猜测
您正在使用RETURN,因此没有数据集可以读取第1列,第1行是ExecuteScalar
使用SELECT或OUTPUT参数
编辑:实际上,不是那么随意
RETURN 1
不是结果集:它是一个“特殊”参数
sqlCmd.Parameters.Add(New SqlParameter("RETURN_VALUE", SqlDbType.Int)).Direction = ParameterDirection.ReturnValue