0

我有一个存储过程

create proc GetCodes
@Code varchar(10),
@Page int = 1,
@Rows int = 10,
@output int output

as

select * from(
  Select *, row_number() over(order by code) as RowNum
  from codes
  where code like '%'+@code+'%'
) as tbl
where @Rows = 0 or RowNum between ((@Page - 1) * @Rows + 1) and (@Page * @Rows)
order by code

set @output = @@ROWCOUNT

我有一个 c# 脚本

SqlCommand cmdSelect = new SqlCommand("GetCodes", SQLData);
cmdSelect.CommandType = CommandType.StoredProcedure;
cmdSelect.Parameters.Add(new SqlParameter("@Code", (Request.QueryString["Code"] != null) ? Request.QueryString["Code"] : ""));
cmdSelect.Parameters.Add(new SqlParameter("@Page", (Request.QueryString["Page"] != null) ? Request.QueryString["Page"] : "1"));
cmdSelect.Parameters.Add(new SqlParameter("@Rows", (Request.QueryString["Rows"] != null) ? Request.QueryString["Rows"] : "10"));
cmdSelect.Parameters.Add(new SqlParameter("@output", SqlDbType.Int));
cmdSelect.Parameters["@output"].Direction = ParameterDirection.Output;
SQLData.Open();
SqlDataReader dtrReader = cmdSelect.ExecuteReader();

int numRows = (int)cmdSelect.Parameters["@output"].Value;

它给了我一个错误“对象引用未设置为对象的实例”的行

int numRows = (int)cmdSelect.Parameters["@output"].Value;

同样的结果,有什么建议吗?

4

1 回答 1

4

在尝试读取输出参数的值之前,您需要关闭 SqlDataReader。

 SqlDataReader dtrReader = cmdSelect.ExecuteReader();
 ..... do your stuff....
 dtrReader.Close();

 // Without the previous close the Value is still null and casting to int fails
 int numRows = (int)cmdSelect.Parameters["@output"].Value;

来自SqlDataReader 的 REMARKS 部分

在使用 SqlDataReader 时,关联的 SqlConnection 正忙于为 SqlDataReader 提供服务,除了关闭 SqlConnection 之外,无法对 SqlConnection 执行其他操作。在调用 SqlDataReader 的 Close 方法之前就是这种情况。例如,在调用 Close 之前,您无法检索输出参数。

还要记住,使用一次性对象(如 SqlConnection、SqlCommand 和 SqlDataReader)的最佳方法是使用using 语句来小心关闭和处理对象。所以,例如你可以写

 using(SqlDataReader dtrReader = cmdSelect.ExecuteReader())
 {

     ..... do your stuff....

 } // At the closing brace the dtrReader will b closed and disposed
于 2013-06-13T21:57:32.453 回答