문제

SQLDATAREADER에 가까이 전화를 걸거나 처분하려고 할 때 시간 초과 만료 된 예외를 얻습니다. SQL Server에 대한 DBConnection이있는 경우 다음과 같이 직접 재현 할 수 있습니다.

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();

reader.close () 또는 reader.dispose ()를 호출하면 system.data.sqlclient.sqlexception을 던집니다.

  • ErrorCode : -2146232060 (0x80131904)
  • 메시지 : "시간 초과가 만료되었습니다. 작업이 완료되기 전에 경과하거나 서버가 응답하지 않습니다."
도움이 되었습니까?

해결책

방금 데이터 리더를 열고 아직 완전히 반복하지 않았기 때문입니다. 아직 완료되지 않은 데이터 리더 (및 DBConnection)를 닫으려고 시도하기 전에 .cancel () DBCommand 객체를해야합니다. 물론 .cancel ()에 의해 DBCommand가 확실하지 않지만 다른 예외가 발생할 수 있습니다. 그러나 당신은 그것이 일어나면 그것을 잡아야합니다.

다른 팁

Cruizer는 답이 있습니다 : call command.cancel () :

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

독자가 이미 모든 행을 읽은 경우에도 취소에 전화 할 수 있다는 것을 아는 것도 도움이됩니다 (예 : 일부는 던지지 않습니다. "취소 할 것이 없다" 예외.)

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

실제로 데이터를 어디서 읽습니까? 당신은 단지 독자를 만들고 있지만 데이터를 읽는 것은 아닙니다. 그것은 단지 추측 일 뿐이지 만 독자가 읽지 않으면 문을 닫는 데 문제가있을 것입니다.)

DbDataReader rdr = cmd.ExecuteReader();
while(rdr.Read())
{
    int index = rdr.GetInt32(0);
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top