使用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
上述就是C#学习教程:使用c#从存储过程读出参数时出现问题分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/949906.html