我有这个方法:
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关联,并且第一个应该是先关闭
答案 0 :(得分:3)
由于它在事务范围内,我确信ADO.Net提供与数据库相同的物理连接,但我认为文本 此命令已经关联 是一个红色的鲱鱼 - 尝试将MultipleActiveResultSets=True
添加到您的连接字符串。
您遇到的情况是yield return
的函数在完全遍历IEnumerable
对象之前未完全评估 - 默认情况下,SqlConnections只允许一个DataReader激活他们一次。
另外,我赞赏你正确使用使用语句 - 但要注意,在你走完整个IEnumerable
之前,什么都不会被处置。 (这是ToArray()
正在为你做的一切工作。)