Share via


SqlException 클래스

정의

SQL Server에서 경고 또는 오류를 반환할 때 throw되는 예외입니다. 이 클래스는 상속될 수 없습니다.

public ref class SqlException sealed : System::Data::Common::DbException
[System.Serializable]
public sealed class SqlException : System.Data.Common.DbException
public sealed class SqlException : System.Data.Common.DbException
[<System.Serializable>]
type SqlException = class
    inherit DbException
type SqlException = class
    inherit DbException
Public NotInheritable Class SqlException
Inherits DbException
상속
SqlException
특성

예제

다음 예제에서는 를 SqlException 생성한 다음 예외를 표시합니다.

using Microsoft.Data.SqlClient;
using System.Text;

class Program
{
    static void Main()
    {
        string s = GetConnectionString();
        ShowSqlException(s);
        Console.ReadLine();
    }
    public static void ShowSqlException(string connectionString)
    {
        string queryString = "EXECUTE NonExistantStoredProcedure";
        StringBuilder errorMessages = new StringBuilder();

        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            SqlCommand command = new SqlCommand(queryString, connection);
            try
            {
                command.Connection.Open();
                command.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                for (int i = 0; i < ex.Errors.Count; i++)
                {
                    errorMessages.Append("Index #" + i + "\n" +
                        "Message: " + ex.Errors[i].Message + "\n" +
                        "LineNumber: " + ex.Errors[i].LineNumber + "\n" +
                        "Source: " + ex.Errors[i].Source + "\n" +
                        "Procedure: " + ex.Errors[i].Procedure + "\n");
                }
                Console.WriteLine(errorMessages.ToString());
            }
        }
    }

    static private string GetConnectionString()
    {
        // To avoid storing the connection string in your code, 
        // you can retrieve it from a configuration file.
        return "Data Source=(local);Initial Catalog=AdventureWorks;"
            + "Integrated Security=SSPI";
    }
}

설명

이 클래스는 SQL Server .NET Framework 데이터 공급자가 서버에서 생성된 오류가 발생할 때마다 생성됩니다. (클라이언트 쪽 오류는 표준 공용 언어 런타임 예외를 throw 됨). SqlException 의 인스턴스를 하나 이상 항상 포함 SqlError합니다.

심각도 수준이 10 이하인 메시지는 정보를 제공하고 사용자가 입력한 정보의 실수로 인한 문제를 나타냅니다. 11에서 16까지의 심각도 수준은 사용자가 생성하며 사용자가 수정할 수 있습니다. 17에서 25까지의 심각도는 소프트웨어나 하드웨어 오류를 나타냅니다. 수준 17, 18 또는 19 오류가 발생하면 특정 문을 실행하지 못할 수도 있지만 작업을 계속할 수 있습니다.

SqlConnection 심각도 수준이 19 이하인 경우 는 열린 상태로 유지됩니다. 심각도 수준이 20 이상인 경우 서버는 일반적으로 를 닫습니다 SqlConnection. 그러나 사용자는 연결을 다시 열고 계속할 수 있습니다. 두 경우 모두 명령을 SqlException 실행하는 메서드에 의해 이 생성됩니다.

SQL Server 보낸 경고 및 정보 메시지에 대한 자세한 내용은 데이터베이스 엔진 이벤트 및 오류를 참조하세요. 클래스는 SqlException SQL Server 심각도에 매핑합니다.

다음은 예외 처리에 대한 일반적인 정보입니다. 코드는 애플리케이션 충돌을 방지 하 고 관련 오류 메시지를 사용자에 게 표시를 허용 하는 예외를 catch 해야 합니다. 데이터 충돌 등 클라이언트 애플리케이션에서 어떻게에 관계 없이 일관 되도록 데이터베이스 트랜잭션을 사용할 수 있습니다. System.Transaction.TransactionScope 또는 BeginTransaction 메서드(System.Data.OleDb.OleDbConnection, System.Data.ODBC.ODBCConnection 및 Microsoft.Data.SqlClient.SqlConnection)와 같은 기능은 공급자가 발생한 예외에 관계없이 일관된 데이터를 보장합니다. 트랜잭션이 실패할 수 있으므로 오류를 catch하고 트랜잭션을 다시 시도합니다.

.NET Framework 4.5 SqlException 부터 내부 Win32Exception를 반환할 수 있습니다.

.NET Framework 데이터 공급자의 예외 클래스는 공급자별 오류를 보고합니다. 예를 들어 System.Data.Odbc에는 OdbcException이 있고, System.Data.OleDb에는 OleDbException이 있고, Microsoft.Data.SqlClient에는 SqlException이 있습니다. 최상의 오류 세부 정보를 보려면 이러한 예외를 catch하고 이러한 예외 클래스의 멤버를 사용하여 오류에 대한 세부 정보를 가져옵니다.

공급자별 오류 외에도 .NET Framework 데이터 공급자 유형은 System.OutOfMemoryException 및 System.Threading.ThreadAbortException과 같은 .NET Framework 예외를 발생할 수 있습니다. 이러한 예외에서 복구할 수 없습니다.

잘못된 입력으로 인해 .NET Framework 데이터 공급자 형식이 System.ArgumentException 또는 System.IndexOutOfRangeException과 같은 예외를 발생시킬 수 있습니다. 잘못된 시간에 메서드를 호출하면 System.InvalidOperationException이 발생합니다.

따라서 일반적으로 공용 언어 런타임의 예외뿐만 아니라 공급자별 예외를 catch하는 예외 처리기를 작성합니다. 다음과 같이 계층화할 수 있습니다.

try {  
   // code here  
}  
catch (SqlException odbcEx) {  
   // Handle more specific SqlException exception here.  
}  
catch (Exception ex) {  
   // Handle generic ones here.  
}  

또는

try {  
   // code here  
}  
catch (Exception ex) {  
   if (ex is SqlException) {  
      // Handle more specific SqlException exception here.  
   }  
   else {  
      // Handle generic ones here.  
   }  
}  

스택에 사용자 코드가 없는 스레드 풀 스레드에서 .NET Framework 데이터 공급자 메서드 호출이 실패할 수도 있습니다. 이 경우 비동기 메서드 호출을 사용 하는 경우, 등록 해야 합니다 UnhandledException 이러한 예외를 처리 하 고 애플리케이션 충돌을 방지 하기 위해 이벤트입니다.

속성

BatchCommand

일괄 처리에서 예외가 발생하지 않은 경우 오류를 생성한 BatchCommand instance 가져옵니다.

Class

.NET Framework Data Provider for SQL Server에서 반환한 오류의 심각도 수준을 가져옵니다.

ClientConnectionId

클라이언트 연결 ID를 나타냅니다. 자세한 내용은 ADO.NET의 데이터 추적을 참조하세요.

Errors

.NET Framework Data Provider for SQL Server에서 생성된 예외에 대한 자세한 정보를 제공하는 하나 이상의 SqlError 개체 컬렉션을 가져옵니다.

LineNumber

오류를 생성한 Transact-SQL 명령 일괄이나 저장 프로시저의 줄 번호를 가져옵니다.

Number

오류의 형식을 식별하는 번호를 가져옵니다.

Procedure

오류를 생성한 저장 프로시저 또는 RPC(원격 프로시저 호출)의 이름을 가져옵니다.

Server

오류를 생성한 SQL Server 인스턴스를 실행하는 컴퓨터의 이름을 가져옵니다.

Source

오류를 생성한 공급자의 이름을 가져옵니다.

State

오류, 경고 또는 "데이터 없음" 메시지를 나타내는 SQL Server에서 숫자 오류 코드를 가져옵니다. 이러한 값을 디코딩하는 방법은 데이터베이스 엔진 이벤트 및 오류를 참조하세요.

메서드

GetObjectData(SerializationInfo, StreamingContext)
사용되지 않음.

예외에 대한 정보를 사용하여 SerializationInfo를 설정합니다.

ToString()

현재 SqlException 개체를 나타내고 클라이언트 연결 ID를 포함하는 문자열을 반환합니다. 자세한 내용은 ClientConnectionId를 참조하십시오.

적용 대상

추가 정보