2008-09-25 1 views
5

SqlDataReader에서 Close 또는 Dispose를 호출 할 때 제한 시간이 만료되었습니다. 당신이 reader.Close() 또는 reader.Dispose()를 호출하면.NET : SqlDataReader.Close 또는 .Dispose 시간 초과 예외가 만료되었습니다.

String CRLF = "\r\n"; 
String sql = 
    "SELECT * " + CRLF + 
    "FROM (" + CRLF + 
    " SELECT (a.Number * 256) + b.Number AS Number" + CRLF + 
    " FROM master..spt_values a," + CRLF + 
    "  master..spt_values b" + CRLF + 
    " WHERE a.Type = 'p'" + CRLF + 
    "  AND b.Type = 'p') Numbers1" + CRLF + 
    " FULL OUTER JOIN (" + CRLF + 
    "  SELECT (print("code sample");a.Number * 256) + b.Number AS Number" + CRLF + 
    "  FROM master..spt_values a," + CRLF + 
    "   master..spt_values b" + CRLF + 
    "  WHERE a.Type = 'p'" + CRLF + 
    "   AND b.Type = 'p') Numbers2" + CRLF + 
    " ON 1=1"; 

DbCommand cmd = connection.CreateCommand(); 
cmd.CommandText = sql; 
DbDataReader rdr = cmd.ExecuteReader(); 
rdr.Close(); 

그것이 System.Data.SqlClient.SqlException가 발생합니다 : 당신이 SQL Server에 DbConnection있는 경우에, 당신은 그것을 직접 재현 할 수

  • 는 ErrorCode가 : -2146232060 (0x80131904)
  • 메시지 : "제한 시간이 만료 타임 아웃 기간이 동작의 완료에 앞서 경과 또는 서버가 응답하지 않는다.."

답변

13

방금 ​​데이터 리더를 열고 아직 완전히 반복하지 않았기 때문입니다. 아직 완성되지 않은 데이터 판독기 (및 DbConnection도)를 닫으려고하기 전에 DbCommand 개체를 .Cancel()해야합니다. 물론, DbCommandCancel()을 사용하면 확신 할 수 없지만 다른 예외가 발생할 수 있습니다. 그런 일이 생기면 그냥 잡아야합니다.

0

어디 실제로 데이터를 읽습니까? 당신은 단지 독자를 만들고 있지만, 데이터를 읽지는 않습니다. 또한 도움이된다

using (DbCommand cmd = connection.CreateCommand()) 
{ 
    cmd.CommandText = sql; 
    using (DbDataReader rdr = cmd.ExecuteReader()) 
    { 
     while (rdr.Read()) 
     { 
      if (WeShouldCancelTheOperation()) 
      { 
      cmd.Cancel(); 
      break; 
      } 
     } 
    }  
} 

: command.Cancel을 (전화) :

DbDataReader rdr = cmd.ExecuteReader(); 
while(rdr.Read()) 
{ 
    int index = rdr.GetInt32(0); 
} 
+0

문제가 발생 행, 한 행 또는 여러 행. –

2

Cruizer 답을했다), 그것은 단지 추측하지만 어쩌면 독자는 독서하지 않는 경우 종료 문제가있다 독자가 이미 모든 행을 읽을 경우에도 취소를 호출 할 수 있음을 알고 (이 예외를 일부 "취소 아무것도"던져하지 않습니다 즉.) 당신이 제로를 읽으면

DbCommand cmd = connection.CreateCommand(); 
try 
{ 
    cmd.CommandText = sql; 
    DbDataReader rdr = cmd.ExecuteReader(); 
    try 
    { 
     while (rdr.Read()) 
     { 
      if (WeShouldCancelTheOperation()) 
      break; 
     } 
     cmd.Cancel(); 
    }  
    finally 
    { 
     rdr.Dispose(); 
    } 
} 
finally 
{ 
    cmd.Dispose(); 
}