Gestione degli errori

Scaricare il driver JDBC

Quando si utilizza il driver Microsoft JDBC per SQL Server, tutte le condizioni di errore del database vengono restituite all'applicazione Java come eccezioni utilizzando la classe SQLServerException. I metodi seguenti della classe SQLServerException sono ereditati da java.sql.SQLException e java.lang.Throwable. Possono essere usati per restituire informazioni specifiche sull'errore di SQL Server che si è verificato:

  • getSQLState() restituisce il codice di stato standard X/Open o SQL99 dell'eccezione.

  • getErrorCode() restituisce il numero di errore del database specifico.

  • getMessage() restituisce il testo completo dell'eccezione. Nel testo del messaggio di errore viene descritto il problema e spesso sono inclusi i segnaposto per le informazioni, ad esempio i nomi degli oggetti, che sono inseriti nel messaggio di errore quando viene visualizzato.

  • getSQLServerError() restituisce l'oggetto SQLServerError contenente informazioni dettagliate sull'eccezione ricevute da SQL Server. Questo metodo restituisce null se non si è verificato nessun errore del server.

Per ottenere ulteriori dettagli sull'errore generato dal server, è possibile usare i metodi seguenti della classe SQLServerError.

  • SQLServerError.getErrorMessage() restituisce il messaggio di errore ricevuto dal server.

  • SQLServerError.getErrorNumber() restituisce un numero che identifica il tipo di errore.

  • SQLServerError.getErrorState() restituisce un codice di errore numerico di SQL Server che rappresenta un messaggio di errore, un avviso o "Impossibile trovare dati".

  • SQLServerError.getErrorSeverity() restituisce il livello di gravità dell'errore.

  • SQLServerError.getServerName() restituisce il nome del computer in cui è in esecuzione un'istanza di SQL Server che ha generato l'errore.

  • SQLServerError.getProcedureName() Restituisce il nome della stored procedure o della chiamata di procedura remota (RPC) che ha generato l'errore.

  • SQLServerError.getLineNumber() restituisce il numero di riga nel batch dei comandi Transact-SQL o nella stored procedure che ha generato l'errore.

Nel prossimo esempio viene passata alla funzione una connessione aperta al database di esempio SQL Server AdventureWorks2022 e viene costruita un'istruzione SQL in formato non corretto che non contiene la clausola FROM. L'istruzione viene quindi eseguita con conseguente elaborazione di un'eccezione SQL.

public static void executeSQLException(Connection con) {
    try (Statement stmt = con.createStatement();) {
        String SQL = "SELECT TOP 10 * Person.Contact";
        ResultSet rs = stmt.executeQuery(SQL);

        while (rs.next()) {
            System.out.println(rs.getString("FirstName") + " " + rs.getString("LastName"));
        }
    }
    catch (SQLException se) {
        do {
            System.out.println("SQL STATE: " + se.getSQLState());
            System.out.println("ERROR CODE: " + se.getErrorCode());
            System.out.println("MESSAGE: " + se.getMessage());
            System.out.println();
        }
        while (se != null);
    }
}

Uso di ServerMessageHandler

A partire dalla versione 12.8.0, il driver ha aggiunto ServerMessageHandler, consentendo una maggiore quantità di controllo sul feedback e la registrazione degli errori. Per usare ServerMessageHandler, è necessario implementare l'interfaccia ISQLServerMessageHandler. Le funzionalità di ServerMessageHandler comprendono:

Commenti sui messaggi

Consente di ricevere feedback da query a esecuzione prolungata, ad esempio i messaggi di stato. Ad esempio, RAISERROR ('Progress message...', 0, 1) WITH NOWAIT.

Registrazione degli errori universali

Consente al gestore di messaggi di gestire la registrazione per tutti gli errori.

Gestione degli errori universali

Consente di posizionare la logica di gestione degli errori solo ServerMessageHandler, anziché ripetere la stessa gestione degli errori in tutta l'applicazione.

Modificare un mapping della gravità del messaggio di errore

Consente di riconoscere e modificare la gravità dei messaggi di errore specifici:

  • SQLServerError.toSQLServerInfoMessage() restituisce ISQLServerMessage, creato eseguendo il downgrade di un messaggio di errore a un messaggio di informazioni.

  • SQLServerError.toSQLServerInfoMessage(int newErrorSeverity) restituisce ISQLServerMessage, creato eseguendo il downgrade di un messaggio di errore a un messaggio di informazioni, con una nuova gravità di errore.

  • SQLServerError.toSQLServerInfoMessage(int newErrorSeverity, int newErrorNumber) restituisce ISQLServerMessage, creato eseguendo il downgrade di un messaggio di errore a un messaggio di informazioni, con una nuova gravità di errore e numero errore.

  • SQLServerInfoMessage.toSQLServerError() restituisce ISQLServerMessage, creato eseguendo l'aggiornamento di un messaggio di errore a un messaggio di informazioni.

  • SQLServerInfoMessage.toSQLServerError(int newErrorSeverity) restituisce ISQLServerMessage, creato eseguendo l'aggiornamento di un messaggio di errore a un messaggio di informazioni, con una nuova gravità di errore.

  • SQLServerInfoMessage.toSQLServerError(int newErrorSeverity, int newErrorNumber) restituisce ISQLServerMessage, creato eseguendo l'aggiornamento di un messaggio di errore a un messaggio di informazioni, con una nuova gravità di errore e numero errore.

SQLExceptionChaining

Inoltre, con la versione 12.8.0, è possibile concatenare SQLExceptions, in modo che il messaggio di eccezione finale contenga automaticamente tutte le eccezioni che altrimenti potrebbero essere state perse. Questa funzionalità è abilitata per impostazione predefinita.

Vedi anche

Diagnosi dei problemi relativi al driver JDBC