2010-08-10 73 views
2

我有这样的方法:是使用相同的变量不同调用静态方法

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和第一个应该首先关闭错误

回答

3

因为它是在一个事务范围内,我敢肯定,ADO.Net被提供到数据库的同一物理连接,但我认为命令已经被相关是一个红色的鲱鱼的文字 - 尝试将MultipleActiveResultSets=True添加到您的连接字符串中。

您在这里遇到的情况是yield return的功能,直到IEnumerable对象完全行走才会被完全评估 - 并且默认情况下,SqlConnections一次只允许一个DataReader对其激活。

此外,我赞扬您正确使用使用语句 - 但请注意,除非您走完整个IEnumerable,否则任何内容都不会被废弃。 (这是ToArray()正在为你做的一切工作。)

相关问题