gpt4 book ai didi

c# - 是一个静态方法,对不同的调用使用相同的变量

转载 作者:行者123 更新时间:2023-11-30 22:44:23 24 4
gpt4 key购买 nike

我有这个方法:

 public static IEnumerable<T> ExecuteReaderSp<T>(string sp, string cs, object parameters) where T : new()
{
using (var conn = new SqlConnection(cs))
{
using (var cmd = conn.CreateCommand())
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = sp;
cmd.InjectFrom<SetParamsValues>(parameters);
conn.Open();
using (var dr = cmd.ExecuteReader())
while (dr.Read())
{
var o = new T();
o.InjectFrom<ReaderInjection>(dr);
yield return o;
}
}
}
}

当我在“事务范围”

中调用它时(使用不同的 T 和 sp),我遇到了这种情况

如果我没有在第一次调用时调用 .ToArray(),那么我会收到一个错误,告诉我这个命令已经与另一个 DataReader 相关联并且第一个应该先关闭

最佳答案

因为它在事务范围内,我确信 ADO.Net 正在提供与数据库相同的物理连接,但我认为文本 this Command is already associated 是一条红鲱鱼 - 尝试将 MultipleActiveResultSets=True 添加到您的连接字符串。

您在这里遇到的情况是,在 IEnumerable 对象完全遍历之前,具有 yield return 的函数不会被完全评估 - 而 SqlConnections,默认情况下,仅允许一个 DataReader 一次对它们处于事件状态。

此外,我赞赏您正确使用 using 语句 - 但请注意,在您遍历整个 IEnumerable 之前,不会处理任何内容。 (这就是 ToArray() 为您所做的,以使其一切正常。)

关于c# - 是一个静态方法,对不同的调用使用相同的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3449555/

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