Lacrime e dolore
Possono verificarsi errori durante l'esecuzione di un programma Java. Quando si lavora con il database, si verificheranno errori. È tutto su quale di loro puoi prevedere e offrire una soluzione adeguata.
Il primo grande gruppo di errori ti aspetterà durante l'esecuzione di questa riga:
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "secret");
Cosa puoi aspettarti qui?
Errore 1. Driver non trovato .
Se ricevi l'errore "Nessun driver adatto trovato per …" , significa che DriverManager non è riuscito a capire quale tipo di DBMS si trova dietro il tuo URL. Ad esempio, hai scritto jdbc_mysql: invece di jdbc:mysql:
Errore 2. Errore di connessione .
Se commetti un errore nel nome host, molto probabilmente riceverai un messaggio del tipo "Nessun host di questo tipo è noto" o "Errore del collegamento di comunicazione".
Errore 3. Il nome del database non è corretto .
Se hai scritto male il nome del database o ti sei connesso a un altro server dove non esiste, riceverai un messaggio come "Database sconosciuto 'supershop3'" .
Errore 4. Login o password errati .
Se hai dimenticato la password del database o l'hai inserita in modo errato, molto probabilmente riceverai un messaggio del tipo "Accesso negato per l'utente 'root'@'localhost' (utilizzando la password: YES)" .
Eccezione SQL
Se la connessione alla base viene comunque stabilita, sarà ulteriormente interessante. In caso di errori quando si lavora con il database, JDBC ha un'eccezione speciale: java.sql.SQLException . Così come molte delle sue varietà.
Questa eccezione ha un solo metodo aggiuntivo (rispetto alla classe Exception): il metodo getSQLState(), che restituisce il codice di stato (stringa) restituito dal server SQL. La gestione degli errori è simile a questa:
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "secret");
try {
int rowsCount = statement.executeUpdate("DELETE FROM ‘Unemployees’");
} catch (SQLException ex) {
// If table doesn't exist
if (ex.getSQLState().compareTo("X0Y32") != 0) {
throw ex;
}
} finally {
connection.close();
}
Ci sono centinaia di codici di errore. Puoi vedere l'elenco completo qui .
Ma a volte i codici di errore aiutano JDBC a comprendere meglio l'errore e quindi genera non solo SQLException, ma SQLException specializzato:
BatchUpdateException | Errore durante la richiesta di gruppo |
Troncamento dei dati | Si verifica spesso durante il troncamento di dati lunghi |
SQLClientInfoException | Il client ha passato parametri che non possono essere impostati sulla connessione: Connessione |
SQLDataException | Errore con i dati, i dettagli dipendono dal tipo di DBMS |
SQLException | Errore di accesso al database o altri errori generali |
SQLFeatureNotSupportedException | DBMS non supporta questa funzionalità |
SQLIntegrityConstraintViolationException | Tutti gli errori con per SQLState ==22 |
SQLInvalidAuthorizationSpecException | Errore di accesso e/o autorizzazione |
SQLNonTransientConnectionException | Tutti gli errori con per SQLState ==08 |
SQLRecoverableException | C'è un errore, ma può essere corretto con l'intervento dell'applicazione |
SQLSyntaxErrorException | Errore nella sintassi della query |
SQLTimeoutException | La richiesta ha richiesto troppo tempo |
SQLTransactionRollbackException | Errore durante il rollback della transazione |
SQLWarning | Avviso emesso dal DBMS |
Esempi di errore
Se si è verificato un errore nella fase dell'applicazione server, di solito può solo essere registrato e quindi trattato in modo più dettagliato. Ma se è successo mentre l'applicazione era in esecuzione sul computer del programmatore, è necessario indagare attentamente sul motivo.
Ci sono due maggiori classi di errori quando si lavora con un database:
- Errore nel testo della richiesta
- Errore durante l'utilizzo di ResultSet
Un errore nel testo della richiesta può verificarsi molto spesso. La query può essere molto lunga, contenere diverse tabelle (unite tramite JOIN) e sottoquery (SUBSELECT). Non è facile trovare un errore in una simile richiesta. Inoltre, le richieste sono spesso incollate insieme da parti, i dati vengono aggiunti lì.
Il primo errore di cui dovresti essere a conoscenza è SQLSyntaxErrorException . Un tale errore di solito significa che hai un errore di battitura nel corpo della richiesta.
Prendiamo il nostro esempio preferito:
ResultSet results = statement.executeQuery("SELECT Count(*) FROM user");
results.next();
int count = results.getInt(1);
E "accidentalmente" cancella l'asterisco nel corpo della richiesta:
ResultSet results = statement.executeQuery("SELECT Count() FROM user");
results.next();
int count = results.getInt(1);
Quindi avremo un'eccezione:
Exception in thread "main" java.sql.SQLSyntaxErrorException:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM task' at line 1
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
Il server SQL ci dice che c'era un errore di sintassi prima di FROM.
Esaminiamo attentamente la richiesta e pensiamo. Se non ti viene in mente nulla, e questo accade molto spesso, allora devi chiedere a qualcuno di vedere cosa c'è che non va.
Un altro errore comune è il lavoro errato con ResultSet , il risultato della richiesta. Supponiamo di aver dimenticato che prima di leggere i dati, la "riga corrente" dell'oggetto ResultSet viene prima della prima riga, allora avrai il seguente codice:
ResultSet results = statement.executeQuery("SELECT Count(*) FROM user");
// results.next();
int count = results.getInt(1);
Otterrai questo errore:
2012 12:55:48 AM jButton5ActionPerformed
SEVERE: null
java.sql.SQLException: Before start of result set
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:841)
at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5650)
at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5570)
Osserviamo attentamente l'errore e pensiamo. Quindi cerchiamo su Google e troviamo un paio di esempi e proviamo a capire la soluzione.