SQLServer 시간 초과 예외를 포착하는 방법


117

다르게 처리 할 수 ​​있도록 특별히 SQL 서버 시간 초과 예외를 포착해야합니다. SqlException을 잡은 다음 메시지 문자열에 "Timeout"이 포함되어 있는지 확인할 수 있지만 더 나은 방법이 있는지 궁금합니다.

try
{
    //some code
}
catch (SqlException ex)
{

    if (ex.Message.Contains("Timeout"))
    {
         //handle timeout
    }
    else
    {
         throw;
    }
}

ConnectionTimeout 또는 CommandTimeout을 찾고 있습니까? 즉, 연결이 실패하거나 실행 된 명령이 실패 할 것으로 예상하고 있습니까?
edosoft

내가 생각하는 30 초의 기본값으로 설정된 CommandTimeout을 찾고 있어요
brodie

답변:


157

시간 초과를 확인하려면 ex.Number의 값을 확인하십시오. -2이면 시간 초과 상황입니다.

-2는 SQL Server 용 MDAC 드라이버 인 DBNETLIB에서 반환 된 시간 초과 오류 코드입니다. Reflector 를 다운로드 하고 System.Data.SqlClient.TdsEnums에서 TIMEOUT_EXPIRED에 대해 살펴보면 확인할 수 있습니다 .

코드는 다음과 같습니다.

if (ex.Number == -2)
{
     //handle timeout
}

실패를 보여주는 코드 :

try
{
    SqlConnection sql = new SqlConnection(@"Network Library=DBMSSOCN;Data Source=YourServer,1433;Initial Catalog=YourDB;Integrated Security=SSPI;");
    sql.Open();

    SqlCommand cmd = sql.CreateCommand();
    cmd.CommandText = "DECLARE @i int WHILE EXISTS (SELECT 1 from sysobjects) BEGIN SELECT @i = 1 END";
    cmd.ExecuteNonQuery(); // This line will timeout.

    cmd.Dispose();
    sql.Close();
}
catch (SqlException ex)
{
    if (ex.Number == -2) {
        Console.WriteLine ("Timeout occurred");
    }
}

예, 그게 제가 지금하고있는 일입니다.하지만 -2를 확인하는 것은 그리 우아하지 않습니다
brodie

12
Red Gate의 Reflector를 다운로드하고 TIMEOUT_EXPIRED를 검색합니다. System.Data.SqlClient.TdsEnums에 있으며 값은 -2입니다. : o)
Jonathan

2
Reflector에 액세스 할 수없는 분들을 위해 : link
ankitk

4
@brodie 그래서 상수를 만들어야하며 상수에 대한 주석에서 "마법"값이 어디서 왔는지 설명 할 수 있습니다.
Jason L.

18

여기 : http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework.adonet/2006-10/msg00064.html Thomas Weingartner가 쓴 글

도 읽을 수 있습니다 .

시간 초과 : SqlException.Number == -2 (ADO.NET 오류 코드)
일반 네트워크 오류 : SqlException.Number == 11
교착 상태 : SqlException.Number == 1205 (SQL Server 오류 코드)

...

"일반 네트워크 오류"도 시간 초과 예외로 처리합니다. 업데이트 / 삽입 / 삭제 쿼리가 장기 실행 트리거를 발생시키는 경우와 같은 드문 경우에만 발생합니다.


6

C # 6 용으로 업데이트되었습니다.

    try
    {
        // some code
    }
    catch (SqlException ex) when (ex.Number == -2)  // -2 is a sql timeout
    {
        // handle timeout
    }

매우 간단하고보기 좋습니다 !!


0

SqlException.ErrorCode 속성의 값은 무엇입니까? 그것으로 작업 할 수 있습니까?

시간 초과가 발생하면 -2146232060에 대한 코드를 확인하는 것이 좋습니다 .

나는 이것을 당신의 데이터 코드에서 정적 const로 설정할 것입니다.


2
ErrorCode에 대한 문서를 보면 Interop-Level 오류를보고하는 것 같습니다. 따라서 COM 오류 수준에 더 가깝거나 공급자가 수행중인 작업과 관련된 특정 오류 대신 예외 (일반적으로)가 발생했을 수 있습니다.
Eric Tuttleman

@Eric이 정확합니다. 이는 예외 소스가 아닌 SqlException 유형에 대한 HRESULT 코드입니다.
codekaizen 2011

0

확실하지 않지만 실행 시간이 초과되거나 명령 시간이 초과 된 경우 클라이언트는 SQL Server에 "ABORT"를 보낸 다음 쿼리 처리를 중단합니다. 트랜잭션이 롤백되지 않고 잠금이 해제되지 않습니다. 이 문제를 해결하려면 저장 프로 시저에서 트랜잭션을 제거하고 .Net 코드에서 SQL 트랜잭션을 사용하여 sqlException을 관리합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.