다음을 통해 공유


응용 프로그램 오류 및 메시지 처리

SQL Server 데이터베이스 엔진 또는 RAISERROR 문으로 인해 발생한 오류는 결과 집합에 포함되지 않습니다. 오류는 결과 집합 처리와는 별도의 오류 처리 메커니즘을 통해 응용 프로그램에 반환됩니다.

모든 데이터베이스 API(응용 프로그래밍 인터페이스)에는 오류 및 메시지를 반환하는 함수, 인터페이스, 메서드, 개체 및 구조체의 집합이 있습니다. 모든 API 함수나 메서드는 해당 작업의 성공 여부를 나타내는 상태 코드를 반환합니다. 상태 코드가 성공이 아닐 경우 응용 프로그램에서 오류 함수, 메서드, 개체를 호출하여 오류 정보를 검색합니다.

데이터베이스 엔진에서는 다음 두 방법 중 하나로 호출자에게 정보를 반환할 수 있습니다.

  1. 오류

    • sys.messages에서 심각도가 11 이상인 오류

    • 심각도가 11 이상인 RAISERROR 문

  2. 메시지

    • PRINT 문의 출력

    • 여러 DBCC 문의 출력

    • sys.messages에서 심각도가 10 이하인 오류

    • 심각도가 10 이하인 RAISERROR 문

ADO(ActiveX Data Object) 및 OLE DB와 같은 API를 사용하는 응용 프로그램은 대개 오류와 메시지를 구분할 수 없습니다. ODBC(Open Database Connectivity) 응용 프로그램에서 메시지는 SQL_SUCCESS_WITH_INFO 함수 반환 코드를 생성하고 오류는 보통 SQL_ERROR 반환 코드를 생성합니다. 이러한 차이는 오류가 응용 프로그램의 오류 처리기 함수에 반환되고 메시지가 응용 프로그램의 메시지 처리기 함수에 반환되는 DB-Library에서 가장 잘 나타납니다. 이와 마찬가지로 SqlClient 공급자를 사용할 경우 오류는 SqlException 예외를 throw합니다. 메시지는 제어 흐름을 변경하지 않고, InfoMessage 이벤트 처리기에 대한 콜백을 등록하여 응용 프로그램 코드로 차단할 수 있습니다.

다음과 같은 다른 구성 요소도 오류를 발생시킬 수 있습니다.

  • SQL Server OLE DB 공급자와 SQL Server ODBC 드라이버는 자체적인 오류를 발생시킵니다. 이러한 오류의 형식은 API 사양에 정의된 형식과 일치합니다.

  • Net-Library는 자체적인 오류를 발생시킵니다.

  • 확장 저장 프로시저 API는 자체적인 형식의 오류를 발생시킵니다.

  • SQL Server 마법사, 응용 프로그램 및 SQL Server Management Studio나 sqlcmd 등의 유틸리티는 자체적인 오류를 발생시킵니다.

이러한 구성 요소의 오류는 데이터베이스 엔진의 오류와 동일한 기본 메커니즘을 사용하여 호출 응용 프로그램에 반환됩니다. 응용 프로그램은 데이터베이스 엔진 오류와 동일한 오류 처리 논리를 사용하여 이러한 오류를 처리할 수 있습니다. 이러한 오류는 데이터베이스 엔진 외부에서 발생하므로 Transact-SQL TRY…CATCH 구문으로 처리할 수 없습니다. 자세한 내용은 TRY...CATCH(Transact-SQL)를 참조하십시오.

ODBC 오류 처리

ODBC 사양은 ODBC에서 구축된 RDO, DAO(Data Access Object), MFC(Microsoft Foundation Classes) 데이터베이스 클래스 등의 API, OLE DB 및 ADO 같은 일반 데이터베이스 API 오류 모델의 기초가 되는 오류 모델을 도입했습니다. 이것은 SQL Server Native Client ODBC 드라이브에도 적용됩니다. ODBC 모델에서 오류는 다음과 같은 특성을 갖습니다.

  • SQLSTATE

    SQLSTATE는 원래 ODBC 사양에 정의된 5자의 오류 코드입니다. SQLSTATE 코드는 모든 ODBC 드라이버에서 공통적이고 응용 프로그램이 여러 데이터베이스에서 반환되는 각종 오류 코드를 검사하지 않고 기본적인 오류 처리를 코딩하는 방법을 제공합니다. ODBC SQLSTATE는 데이터베이스 엔진 오류 메시지의 상태 특성과 아무 관련이 없습니다.

    ODBC 2.x는 하나의 SQLSTATE 코드 집합을 반환하고 ODBC 3.x는 X/Open Group 데이터 관리: 구조적 쿼리 언어(SQL), 버전 2 표준으로 정렬된 SQLSTATE 코드 집합을 반환합니다. 모든 ODBC 드라이버는 동일한 SQLSTATE 코드 집합을 반환하므로 SQLSTATE 코드 기반의 오류 처리를 사용하는 응용 프로그램은 다른 종류의 컴퓨터에 이식하기가 훨씬 쉽습니다.

  • 원시 오류 번호

    원시 오류 번호는 기본 데이터베이스의 오류 번호입니다. ODBC 응용 프로그램은 데이터베이스 엔진 오류 번호를 원시 오류 번호로 수신합니다.

  • 오류 메시지 문자열

    오류 메시지 문자열 매개 변수에 오류 메시지가 반환됩니다.

ODBC 함수가 SQL_SUCCESS 이외의 상태를 반환하면 응용 프로그램은 SQLGetDiagRec을 호출하여 오류 정보를 가져올 수 있습니다. 예를 들어 ODBC 응용 프로그램에 구문 오류가 발생하면(SQL Server 오류 번호 170) SQLGetDiagRec이 다음을 반환합니다.

szSqlState = 42000, pfNative = 170
szErrorMsg =
'[Microsoft][ODBC SQL Server Driver][SQL Server]
                                     Line 1: Incorrect syntax near *'

ODBC SQLGetDiagField 함수를 사용하여 ODBC 드라이버는 드라이버에서 반환되는 진단 레코드에 드라이버별 진단 필드를 지정할 수 있습니다. SQL Server ODBC 드라이버는 드라이버별 필드를 지정하여 데이터베이스 엔진 심각도, 상태 코드 등의 데이터베이스 엔진 오류 정보를 보관합니다.

ODBC 응용 프로그램에서 오류 메시지를 검색하는 방법은 오류 및 메시지 처리를 참조하십시오.

ADO 오류 처리

ADO는 Errors 개체와 Errors 컬렉션을 사용하여 SQLSTATE, 원시 오류 번호, 오류 메시지 문자열 등의 표준 오류 정보를 반환합니다. 이러한 오류 정보는 해당 ODBC 오류 정보와 동일합니다. ADO는 공급자별 오류 인터페이스를 지원하지 않으므로 ADO 응용 프로그램에서 심각도, 상태 등의 데이터베이스 엔진 관련 오류 정보를 사용할 수 없습니다.

ADO 응용 프로그램에서 오류 메시지를 검색하는 방법은 오류 및 메시지 처리를 참조하십시오.

OLE DB 오류 처리

OLE DB는 IErrorInfo 인터페이스를 사용하여 SQLSTATE, 원시 오류 번호, 오류 문자열 등의 표준 오류 정보를 반환합니다. 이러한 오류 정보는 해당 ODBC 오류 정보와 동일합니다. SQL Server OLE DB 공급자는 심각도, 상태, 프로시저 이름, 줄 번호 등의 데이터베이스 엔진 관련 정보를 반환하는 ISQLServerErrorInfo 인터페이스를 정의합니다.

OLE DB 응용 프로그램에서 오류 메시지를 검색하는 방법은 오류를 참조하십시오.

SqlClient 오류 처리

SqlClient 관리 공급자는 SQL Server 데이터베이스 엔진에서 처리되지 않은 오류가 발생할 경우 SqlException 예외를 throw합니다. 응용 프로그램은 오류 번호, 오류 메시지, 오류 심각도 및 기타 예외 컨텍스트 정보와 같은 서버측 오류 정보를 SqlException 클래스를 통해 검색할 수 있습니다.

SQL Server 데이터베이스 엔진에서 보낸 경고 또는 정보 메시지를 처리하기 위해 응용 프로그램은 SqlConnection 클래스에서 InfoMessage 이벤트를 수신할 SqlInfoMessageEventHandler 대리자를 만들 수 있습니다. 예외의 경우와 마찬가지로 심각도, 상태 등의 메시지 컨텍스트 정보가 인수로 콜백에 전달됩니다.