gpt4 book ai didi

c# - 使用c#从存储过程中读取参数的问题

转载 作者:太空狗 更新时间:2023-10-30 00:12:35 24 4
gpt4 key购买 nike

我刚遇到一个奇怪的问题,我无法检索 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..,我只是想不通为什么它会这样......有人有想法吗?

最佳答案

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

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

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

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

关于c# - 使用c#从存储过程中读取参数的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3803240/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com