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.

Nell'esempio seguente viene passata una connessione aperta al database di esempio AdventureWorks2025 di SQL Server alla funzione e viene costruita un'istruzione SQL non valida che non dispone di una clausola FROM. Viene quindi eseguita l'istruzione e viene elaborata 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 riscontri dalle query di lunga durata, ad esempio messaggi di avanzamento. Ad esempio, RAISERROR ('Progress message...', 0, 1) WITH NOWAIT.

Registrazione universale degli errori

Consente al gestore dei messaggi di occuparsi della registrazione nel log di 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.

Rimappatura del livello di 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 un ISQLServerMessage, creato declassando un messaggio di errore a messaggio informativo, con un nuovo livello di gravità.

  • SQLServerError.toSQLServerInfoMessage(int newErrorSeverity, int newErrorNumber) restituisce un ISQLServerMessage, creato declassando un messaggio di errore a messaggio informativo, con una nuova gravità e un nuovo numero di errore.

  • SQLServerInfoMessage.toSQLServerError() restituisce ISQLServerMessage, creato aggiornando un messaggio di informazioni a un messaggio di errore.

  • SQLServerInfoMessage.toSQLServerError(int newErrorSeverity) restituisce un ISQLServerMessage, creato aggiornando un messaggio informativo a un messaggio di errore, con una nuova gravità dell'errore.

  • SQLServerInfoMessage.toSQLServerError(int newErrorSeverity, int newErrorNumber) restituisce ISQLServerMessage, creato aggiornando un messaggio informativo a un messaggio di errore, con una nuova gravità e un nuovo numero di 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.