2012-11-01 92 views
0

當我從sqldatareader讀取數據時出現錯誤「讀取器關閉時無法嘗試調用Read」。 我的代碼如下sqldatareader錯誤「當閱讀器關閉時,嘗試調用Read無效。」

顯然這是由using語句在ExecSqlDataReader越來越封閉

我希望能夠調用該方法,然後讀者使用另一個類中,有沒有什麼辦法解決這而不必循環ExecSqlDataReader方法中的SqlDataReader?

希望是有道理的

感謝

代碼:

SqlDataReader reader = data.ExecSqlDataReader(1); 
while (reader.Read()) 
    { 
    ..... 
    } 


     public SqlDataReader ExecSqlDataReader(int queryType = 0) 
     { 
     using (var conn = new SqlConnection(this.ConnectionString)) 
     { 
      try 
      { 
       PrepareCommandForExecution(conn, queryType); 
       return _cmd.ExecuteReader(); 

      } 
      finally 
      { 
       _cmd.Connection.Close(); 
      } 
     } 
    } 

    private SqlCommand PrepareCommandForExecution(SqlConnection conn, int sqlType = 0) 
    { 

      _cmd.Connection = conn; 
      switch (sqlType) 
      { 
       case 0: 
        _cmd.CommandType = CommandType.StoredProcedure; 
        break; 
       case 1: 
        _cmd.CommandType = CommandType.Text; 
        _cmd.CommandText = _tSqltext; 
        break; 
       case 2: 
        _cmd.CommandType = CommandType.TableDirect; 
        break; 
      } 

      _cmd.CommandTimeout = this.CommandTimeout; 
      _cmd.Connection.Open(); 

      return _cmd; 

    } 
+2

您正在關閉連接。而已。期。連接已關閉。您無法關閉連接,然後從中讀取。它已關閉! –

回答

3

的問題是,離開功能(通過return語句)踢你出using塊,所以您正在使用的SqlDataReader和SqlConnections被丟棄。爲了解決這個問題,嘗試改變函數簽名是這樣的:

public static IEnumerable<IDataRecord> ExecSqlDataReader(int queryType) 

,然後更新功能的這樣的中間:

using (var reader = cmd.ExecuteReader()) 
{ 
    while (reader.Read()) 
    { 
     yield return reader; 
    } 
} 

你怎麼能使用它:

var first10 = ExecSqlDataReader(0).Take(10); 
foreach (var rec in first10) 
{ 
    int ID = rec.GetInt32(0); 
} 

所以這應該工作,因爲收益導致連接保持活着:

+0

感謝您的幫助Tim – simon1230756

0

你應該也許m改變你的設計以傳回(斷開連接的)DataTable而不是試圖保持連接打開(然後可能「泄漏」)。

相關問題