2012-11-01 4 views
0

sqldatareader에서 데이터를 읽을 때 "리더가 닫혀있을 때 Read를 호출하지 못했습니다."오류가 발생합니다. 내 코드는 분명히 이것은 ExecSqlDataReader에 using 문에 의해 폐쇄지고sqldatareader 오류 "판독기가 닫힌 경우 읽기를 잘못했습니다."

이하

이 둥근있는 방법이 내가이 메소드를 호출 한 후 다른 클래스에 독자를 사용할 수 있도록하고 싶습니다

이 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); 
} 

yield가 연결을 유지하도록하기 때문에 이렇게해야합니다.

+0

도움 주셔서 감사합니다. Tim – simon1230756

0

아마도 m 연결을 열어두기보다는 (연결되지 않은) DataTable을 다시 전달하도록 설계를 odify하십시오.