programing

SQL Server 시간 초과 예외를 잡는 방법

telebox 2023. 5. 22. 20:56
반응형

SQL Server 시간 초과 예외를 잡는 방법

SQL 서버 시간 초과 예외를 구체적으로 파악하여 다르게 처리해야 합니다.SqlException을 확인한 다음 메시지 문자열에 "Timeout"이 포함되어 있는지 확인할 수 있다는 것을 알고 있습니다. 하지만 더 나은 방법이 있을까요?

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

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

타임아웃을 확인하기 위해서는 ex의 값을 확인하는 것으로 알고 있습니다.번호. -2이면 타임아웃 상황입니다.

-2는 SQL Server용 MDAC 드라이버인 DBNETLIB에서 반환된 시간 초과에 대한 오류 코드입니다.이는 Reflector를 다운로드하고 System(시스템) 아래를 보면 알 수 있습니다.Data.SqlClient.TDSEnums for TIMEOUT_EXPIREED

코드는 다음과 같습니다.

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

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

토마스 와인거트너가 다음과 같이 썼다는 도 읽을 수 있습니다.

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

...

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

c# 6에 대해 업데이트됨:

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

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

SqlException의 값입니다.오류 코드 속성?당신은 그것으로 일할 수 있습니까?

시간 초과가 발생할 경우 -2146232060의 코드를 확인할 필요가 있습니다.

나는 이것을 당신의 데이터 코드에 정적 제약 조건으로 설정할 것입니다.

확실하지는 않지만 실행 시간 초과 또는 명령 시간 초과가 발생하면 클라이언트가 SQL Server에 "ABORT"를 보낸 다음 쿼리 처리를 포기합니다.트랜잭션은 롤백되지 않으며 잠금도 해제되지 않습니다.이 문제를 해결하기 위해 저장 프로시저에서 트랜잭션을 제거하고 에서 SQL 트랜잭션을 사용합니다.sqlException을 관리하는 Net 코드

클라이언트가 ABROT를 전송할 때 트랜잭션은 롤백되지 않습니다.이 동작을 방지하려면 https://learn.microsoft.com/en-us/sql/t-sql/statements/set-xact-abort-transact-sql?view=sql-server-ver15 에서 SET_XACT_ABORT를 사용해야 합니다.

언급URL : https://stackoverflow.com/questions/29664/how-to-catch-sqlserver-timeout-exceptions

반응형