Condividi tramite


SqlException Classe

Definizione

Eccezione generata quando SQL Server restituisce un avviso o un errore. La classe non può essere ereditata.

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
Ereditarietà
SqlException
Attributi

Esempio

L'esempio seguente genera un SqlException oggetto e quindi visualizza l'eccezione.

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

Commenti

Questa classe viene creata ogni volta che il provider di dati .NET Framework per SQL Server rileva un errore generato dal server. Gli errori lato client vengono generati come eccezioni di Common Language Runtime standard. SqlException contiene sempre almeno un'istanza di SqlError.

I messaggi con un livello di gravità pari a 10 o meno sono informativi e indicano problemi causati da errori nelle informazioni immesse da un utente. I livelli di gravità da 11 a 16 vengono generati dall'utente e possono essere corretti dall'utente. I livelli di gravità da 17 a 25 indicano errori del software o dell'hardware. Quando si verifica un errore di livello 17, 18 o 19, è possibile continuare a funzionare, anche se potrebbe non essere possibile eseguire un'istruzione specifica.

Se il livello di gravità è pari o inferiore a 19, l'istanza di SqlConnection rimane aperta. Quando il livello di gravità è 20 o superiore, il server chiude normalmente .SqlConnection L'utente può tuttavia riaprire la connessione e continuare. In entrambi i casi, viene generata un'eccezione SqlException dal metodo che esegue il comando.

Per informazioni sui messaggi informativi e di avviso inviati da SQL Server, vedere Eventi e errori del motore di database. La classe esegue il SqlException mapping alla gravità SQL Server.

Di seguito sono riportate informazioni generali sulla gestione delle eccezioni. Il codice deve rilevare le eccezioni per impedire l'arresto anomalo dell'applicazione e consentire la visualizzazione di un messaggio di errore pertinente all'utente. È possibile usare le transazioni di database per assicurarsi che i dati siano coerenti indipendentemente da ciò che accade nell'applicazione client (incluso un arresto anomalo). Funzionalità come System.Transaction.TransactionScope o il metodo BeginTransaction (in System.Data.OleDb.OleDbConnection, System.Data.ODBCConnection e Microsoft.Data.SqlClient.SqlConnection) garantiscono dati coerenti indipendentemente dalle eccezioni generate da un provider. Le transazioni possono avere esito negativo, quindi rilevare errori e riprovare la transazione.

Si noti che a partire da .NET Framework 4.5, SqlException può restituire un oggetto interno Win32Exception.

La classe di eccezione di un provider di dati .NET Framework segnala errori specifici del provider di dati. Ad esempio System.Data.Odbc ha OdbcException, System.Data.OleDb ha OleDbException e Microsoft.Data.SqlClient ha SqlException. Per il livello migliore di dettaglio degli errori, rilevare queste eccezioni e usare i membri di queste classi di eccezione per ottenere i dettagli dell'errore.

Oltre agli errori specifici del provider, i tipi di provider di dati .NET Framework possono generare eccezioni di .NET Framework, ad esempio System.OutOfMemoryException e System.Threading.ThreadAbortException. Il ripristino da queste eccezioni potrebbe non essere possibile.

L'input non valido può causare un tipo di provider di dati .NET Framework per generare un'eccezione, ad esempio System.ArgumentException o System.IndexOutOfRangeException. La chiamata di un metodo al momento errato può generare System.InvalidOperationException.

In generale, scrivere un gestore di eccezioni che rileva eventuali eccezioni specifiche del provider, nonché eccezioni da Common Language Runtime. È possibile eseguire il layering seguente:

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

Oppure:

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

È anche possibile che una chiamata al metodo del provider di dati .NET Framework non riesca in un thread del pool di thread senza codice utente nello stack. In questo caso, e quando si usano chiamate di metodo asincrone, è necessario registrare l'evento per gestire tali eccezioni ed evitare l'arresto UnhandledException anomalo dell'applicazione.

Proprietà

BatchCommand

Ottiene l'istanza di BatchCommand che ha generato l'errore o null se l'eccezione non è stata generata da un batch.

Class

Ottiene il livello di gravità dell'errore restituito dal provider di dati .NET Framework di SQL Server.

ClientConnectionId

Rappresenta l'ID connessione client. Per altre informazioni, vedere Traccia dati in ADO.NET.

Errors

Ottiene un insieme di uno o più oggetti SqlError che contengono informazioni dettagliate relative alle eccezioni generate dal provider di dati .NET Framework di SQL Server.

LineNumber

Ottiene il numero di riga nel batch dei comandi Transact-SQL o nella stored procedure da cui è stato generato l'errore.

Number

Ottiene un numero che identifica il tipo di errore.

Procedure

Ottiene il nome della stored procedure o della RPC (Remote Procedure Call) che ha generato l'errore.

Server

Ottiene il nome del computer su cui è in esecuzione un'istanza di SQL Server da cui è stato generato l'errore.

Source

Ottiene il nome del provider che ha generato l'errore.

State

Ottiene un codice di errore numerico da SQL Server che rappresenta un errore, un avviso o un messaggio in cui viene indicata l'impossibilità di trovare dati. Per altre informazioni su come decodificare questi valori, vedere Database Engine Events and Errors (Eventi ed errori del motore di database).

Metodi

GetObjectData(SerializationInfo, StreamingContext)
Obsoleti.

Imposta l'oggetto SerializationInfo con le informazioni sull'eccezione.

ToString()

Restituisce una stringa che rappresenta l'oggetto SqlException corrente e include l'ID connessione client (per ulteriori informazioni, vedere ClientConnectionId).

Si applica a

Vedi anche