Udostępnij przez


SqlException Klasa

Definicja

Wyjątek zgłaszany podczas SQL Server zwraca ostrzeżenie lub błąd. Klasa ta nie może być dziedziczona.

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
Dziedziczenie
SqlException
Atrybuty

Przykłady

Poniższy przykład generuje wyjątek SqlException , a następnie wyświetla wyjątek.

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

Uwagi

Ta klasa jest tworzona za każdym razem, gdy dostawca danych .NET Framework dla SQL Server napotka błąd wygenerowany na serwerze. (Błędy po stronie klienta są zgłaszane jako standardowe wyjątki środowiska uruchomieniowego języka wspólnego). SqlException zawsze zawiera co najmniej jedno wystąpienie elementu SqlError.

Komunikaty, które mają poziom ważności 10 lub mniej, są informacyjne i wskazują problemy spowodowane błędami w informacjach, które wprowadzono przez użytkownika. Poziomy ważności od 11 do 16 są generowane przez użytkownika i mogą być poprawiane przez użytkownika. Poziomy ważności od 17 do 25 wskazują błędy oprogramowania lub sprzętu. Gdy wystąpi błąd poziomu 17, 18 lub 19, możesz kontynuować pracę, chociaż może nie być w stanie wykonać określonej instrukcji.

Pozostaje SqlConnection otwarty, gdy poziom ważności wynosi 19 lub mniej. Gdy poziom ważności wynosi 20 lub więcej, serwer zwykle zamyka wartość SqlConnection. Jednak użytkownik może ponownie otworzyć połączenie i kontynuować. W obu przypadkach SqlException element jest generowany przez metodę wykonującą polecenie .

Aby uzyskać informacje o komunikatach ostrzegawczych i informacyjnych wysyłanych przez SQL Server, zobacz Zdarzenia i błędy aparatu bazy danych. Klasa SqlException mapuje ważność SQL Server.

Poniżej przedstawiono ogólne informacje dotyczące obsługi wyjątków. Kod powinien przechwytywać wyjątki, aby zapobiec awarii aplikacji i zezwolić na wyświetlenie odpowiedniego komunikatu o błędzie użytkownikowi. Możesz użyć transakcji bazy danych, aby upewnić się, że dane są spójne niezależnie od tego, co dzieje się w aplikacji klienckiej (w tym awarii). Funkcje takie jak System.Transaction.TransactionScope lub metoda BeginTransaction (w metodzie System.Data.OleDb.OleDbConnection, System.Data.ODBC.ODBCConnection i Microsoft.Data.SqlClient.SqlConnection) zapewniają spójne dane niezależnie od wyjątków zgłoszonych przez dostawcę. Transakcje mogą zakończyć się niepowodzeniem, więc przechwyć błędy i ponów próbę transakcji.

Należy pamiętać, że począwszy od .NET Framework 4.5, SqlException może zwrócić wewnętrzną Win32Exceptionwartość .

Klasa wyjątków dostawcy danych .NET Framework zgłasza błędy specyficzne dla dostawcy. Na przykład System.Data.Odbc ma odbcException, System.Data.OleDb ma oleDbException, a Microsoft.Data.SqlClient ma sqlException. Aby uzyskać najlepszy poziom szczegółów błędu, przechwyć te wyjątki i użyj składowych tych klas wyjątków, aby uzyskać szczegółowe informacje o błędzie.

Oprócz błędów specyficznych dla dostawcy typy dostawców danych .NET Framework mogą zgłaszać .NET Framework wyjątki, takie jak System.OutOfMemoryException i System.Threading.ThreadAbortException. Odzyskiwanie z tych wyjątków może nie być możliwe.

Nieprawidłowe dane wejściowe mogą spowodować, że typ dostawcy danych .NET Framework zgłosi wyjątek, taki jak System.ArgumentException lub System.IndexOutOfRangeException. Wywołanie metody w niewłaściwym czasie może wywołać metodę System.InvalidOperationException.

Ogólnie rzecz biorąc, napisz procedurę obsługi wyjątków, która przechwytuje wszelkie wyjątki specyficzne dla dostawcy, a także wyjątki od środowiska uruchomieniowego języka wspólnego. Można je warstwować w następujący sposób:

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

Lub:

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

Istnieje również możliwość niepowodzenia wywołania metody dostawcy danych .NET Framework w wątku puli wątków bez kodu użytkownika w stosie. W takim przypadku i w przypadku używania wywołań metody asynchronicznej należy zarejestrować UnhandledException zdarzenie, aby obsłużyć te wyjątki i uniknąć awarii aplikacji.

Właściwości

BatchCommand

Pobiera wystąpienie batchCommand, które wygenerowało błąd lub wartość null, jeśli wyjątek nie został zgłoszony z partii.

Class

Pobiera poziom ważności błędu zwróconego z dostawcy danych .NET Framework dla SQL Server.

ClientConnectionId

Reprezentuje identyfikator połączenia klienta. Aby uzyskać więcej informacji, zobacz Śledzenie danych w ADO.NET.

Errors

Pobiera kolekcję co najmniej SqlError jednego obiektu, które zawierają szczegółowe informacje o wyjątkach generowanych przez dostawcę danych .NET Framework dla SQL Server.

LineNumber

Pobiera numer wiersza w partii poleceń Języka Transact-SQL lub procedurę składowaną, która wygenerowała błąd.

Number

Pobiera liczbę identyfikującą typ błędu.

Procedure

Pobiera nazwę procedury składowanej lub zdalnego wywołania procedury (RPC), które wygenerowało błąd.

Server

Pobiera nazwę komputera z uruchomionym wystąpieniem SQL Server, które wygenerowało błąd.

Source

Pobiera nazwę dostawcy, który wygenerował błąd.

State

Pobiera kod błędu liczbowego z SQL Server, który reprezentuje komunikat o błędzie, ostrzeżeniu lub "nie znaleziono danych". Aby uzyskać więcej informacji na temat dekodowania tych wartości, zobacz Zdarzenia i błędy aparatu bazy danych.

Metody

GetObjectData(SerializationInfo, StreamingContext)
Przestarzałe.

Ustawia element SerializationInfo z informacjami o wyjątku.

ToString()

Zwraca parametry reprezentujące bieżący SqlException obiekt i zawierają identyfikator połączenia klienta (aby uzyskać więcej informacji, zobacz ClientConnectionId).

Dotyczy

Zobacz też