0

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

谢谢!

4

2 回答 2

3

我将详细说明@gbn 所说的内容。当您执行 SQL 代码时,您可以以三种不同的方式返回信息:OUTPUT参数、表格数据和/或单个RETURN值。就像@gbn 所说,RETURN值本质上是专门的OUTPUT参数。ExecuteScalar只看到来自表格数据的信息,即第一行的第一列。如果调用时未收到表格数据,ExecuteScalar则返回空值。如果你尝试用这个空值做一些事情,那么显然你会得到一个 NRE。

于 2011-01-18T19:17:58.333 回答
2

随机猜测

您正在使用 RETURN,因此没有数据集可以读取 ExecuteScalar 的第 1 列第 1 行

使用 SELECT 或 OUTPUT 参数

编辑:实际上,不是那么随机

RETURN 1不是结果集:它是一个“特殊”参数

sqlCmd.Parameters.Add(New SqlParameter("RETURN_VALUE", SqlDbType.Int)).Direction = ParameterDirection.ReturnValue
于 2011-01-18T19:00:30.323 回答