调用返回1的存储过程时,ExecuteScalar抛出NullReferenceException

时间:2011-01-18 18:42:08

标签: c# sql-server sqlconnection sqlcommand executescalar

我在发布这个问题之前做了一些研究,我知道当没有数据返回时,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;
            }
        }

谢谢!

2 个答案:

答案 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