使用c#从存储过程读出参数时出现问题

我只是遇到一个奇怪的问题,我无法检索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参数之前关闭连接,它工作正常

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

WT ..,我只是无法弄清楚为什么它会像这样……任何人都有想法?

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

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

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

 using(var reader = cmd.ExecuteReader()) { LoadHits(reader); } 

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

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