我刚遇到一个奇怪的问题,我无法检索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值始终为null。但是当我在查询分析器中执行通过探查器生成的查询时,它返回正常。
最后我发现这是由SQL连接引起的。
如果我在阅读out param之前关闭连接
,它会正常工作 LoadHits(reader);
con.close()
if (lstHits.Count > 0)
total = Convert.ToInt32(cmd.Parameters["@total"].Value);
else
total = 0;
WT ..,我只是想弄清楚为什么它会像这样......有人有想法吗?
答案 0 :(得分:7)
参数值在TDS流的 end 处返回(因为您可以在选择数据后在查询结束时更改它)。您必须确保消耗所有 TDS数据(或者至少,导致刷新缓冲区,Close()
为您执行此操作)以获取更新的参数值,例如:
do { while(reader.Read() {} }
while (reader.NextResult());
查询后期引发的SQL错误也是如此。您也可以尝试添加using
;这也可能就足够了:
using(var reader = cmd.ExecuteReader()) {
LoadHits(reader);
}
答案 1 :(得分:5)
要添加到Marc的答案,您可以关闭阅读器(而不是连接)以获得结果。
这是详细记录的(“关闭DataReader”):http://msdn.microsoft.com/en-us/library/haa3afyz(v=VS.100).aspx