2010-08-10 74 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()正在爲你做的一切工作。)

相關問題