4

我刚刚遇到一个奇怪的问题,我无法检索 sql 存储过程输出参数值。我用了将近 2 个小时来解决这个问题。

代码很简单

    using (var con = new SqlConnection(connectionString))
        {
            con.Open();
            SqlCommand cmd = new SqlCommand("sp_mgsearach", con);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlParameter param1 = new SqlParameter("@SearchTerm", SqlDbType.VarChar);
            param1.Value = searchTerm;
            param1.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(param1);
            SqlParameter param2 = new SqlParameter("@start", SqlDbType.Int);
            param2.Value = start;
            param2.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(param2);
            SqlParameter param3 = new SqlParameter("@end", SqlDbType.Int);
            param3.Value = end;
            param3.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(param3);
            SqlParameter param4 = new SqlParameter("@total", SqlDbType.Int);
            param4.Direction = ParameterDirection.InputOutput;
            param4.Value = 0;
            cmd.Parameters.Add(param4);


            var reader = cmd.ExecuteReader();
            LoadHits(reader);           
            if (lstHits.Count > 0)
                total = Convert.ToInt32(cmd.Parameters["@total"].Value);
            else
                total = 0;

        }

@total 值始终为空。但是当我在查询分析器中执行通过探查器生成的查询时,它返回正常。

最后我发现这是由于 SQL 连接。

如果我在读取输出参数之前关闭连接,它工作正常

            LoadHits(reader);           
            con.close()
            if (lstHits.Count > 0)
                total = Convert.ToInt32(cmd.Parameters["@total"].Value);
            else
                total = 0;

WT ..,我只是想不通它为什么会这样..有人知道吗?

4

2 回答 2

7

参数值在TDS 流结束时返回(因为您可以在查询结束时更改它,在选择数据之后)。为了获取更新的参数值,您必须确保使用所有TDS 数据(或至少导致缓冲区被刷新,这对您有用),例如:Close()

do { while(reader.Read() {} }
while (reader.NextResult());

查询后期引发的 SQL 错误也是如此。您也可以尝试添加using; 这也可能就足够了:

using(var reader = cmd.ExecuteReader()) {
    LoadHits(reader);  
}
于 2010-09-27T11:15:53.590 回答
5

要添加到 Marc 的答案,您只需关闭阅读器(而不是连接)即可获得结果。

这是有据可查的(“关闭 DataReader”): http: //msdn.microsoft.com/en-us/library/haa3afyz (v=VS.100).aspx

于 2010-09-27T11:20:35.730 回答