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

时间:2010-08-10 13:42:34

标签: c# .net ado.net

我有这个方法:

 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关联,并且第一个应该是先关闭

1 个答案:

答案 0 :(得分:3)

由于它在事务范围内,我确信ADO.Net提供与数据库相同的物理连接,但我认为文本 此命令已经关联 是一个红色的鲱鱼 - 尝试将MultipleActiveResultSets=True添加到您的连接字符串。

您遇到的情况是yield return的函数在完全遍历IEnumerable对象之前未完全评估 - 默认情况下,SqlConnections只允许一个DataReader激活他们一次。

另外,我赞赏你正确使用使用语句 - 但要注意,在你走完整个IEnumerable之前,什么都不会被处置。 (这是ToArray()正在为你做的一切工作。)