Larmes et douleur

Des erreurs peuvent se produire lors de l'exécution d'un programme Java. Lorsque vous travaillez avec la base de données, des erreurs se produisent. Il s'agit de savoir lequel d'entre eux vous pouvez prévoir et proposer une solution adéquate.

Le premier grand groupe d'erreurs vous attendra lors de l'exécution de cette ligne :

Connection connection  = DriverManager.getConnection("jdbc:mysql://localhost:3306/test",  "root", "secret");

À quoi pouvez-vous vous attendre ici ?

Erreur 1. Pilote introuvable .

Si vous obtenez l'erreur "Aucun pilote approprié trouvé pour …" , cela signifie que le DriverManager n'a pas pu comprendre quel type de SGBD se cache derrière votre URL. Par exemple, vous avez écrit jdbc_mysql: au lieu de jdbc:mysql :

Erreur 2. Erreur de connexion .

Si vous faites une erreur dans le nom d'hôte, vous obtiendrez très probablement un message du type "Aucun hôte de ce type n'est connu" ou "Échec du lien de communication".

Erreur 3. Le nom de la base de données est incorrect .

Si vous avez mal orthographié le nom de la base de données ou si vous vous connectez à un autre serveur où il n'existe pas, vous recevrez un message du type "Base de données inconnue 'supershop3'" .

Erreur 4. Mauvais login ou mot de passe .

Si vous avez oublié le mot de passe de la base de données ou si vous ne l'avez pas saisi correctement, vous recevrez très probablement un message du type "Accès refusé pour l'utilisateur 'root'@'localhost' (en utilisant le mot de passe : OUI)" .

Exception SQL

Si la connexion à la base est néanmoins établie, alors ce sera plus intéressant plus loin. En cas d'erreurs lors de l'utilisation de la base de données, JDBC a une exception spéciale - java.sql.SQLException . Ainsi que plusieurs de ses variétés.

Cette exception n'a qu'une seule méthode supplémentaire (par rapport à la classe Exception) - la méthode getSQLState(), qui renvoie le code d'état (chaîne) que le serveur SQL lui a renvoyé. La gestion des erreurs ressemble à ceci :

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();
 }

Il existe des centaines de codes d'erreur. Vous pouvez voir la liste complète ici .

Mais parfois, les codes d'erreur aident JDBC à mieux comprendre l'erreur, puis il lance non seulement SQLException, mais SQLException spécialisée :

BatchUpdateException Erreur lors de la demande de groupe
Troncature des données Se produit souvent lors de la troncature de données longues
SQLClientInfoException Le client a transmis des paramètres qui ne peuvent pas être définis sur la connexion : Connexion
SQLDataException Erreur avec les données, les détails dépendent du type de SGBD
SQLException Erreur d'accès à la base de données ou autres erreurs générales
SQLFeatureNotSupportedExceptionSQLFeatureNotSupportedException Le SGBD ne prend pas en charge cette fonctionnalité
SQLIntegrityConstraintViolationException Toutes les erreurs avec pour SQLState ==22
SQLInvalidAuthorizationSpecExceptionSQLInvalidAuthorizationSpecException Erreur d'accès et/ou d'autorisation
SQLNonTransientConnectionExceptionSQLNonTransientConnectionException Toutes les erreurs avec pour SQLState ==08
SQLRecoverableExceptionSQLRecoverableException Il y a une erreur, mais elle peut être corrigée avec l'intervention de l'application
SQLSyntaxErrorException Erreur dans la syntaxe de la requête
SQLTimeoutException La demande a pris trop de temps
SQLTransactionRollbackException Erreur lors de la restauration de la transaction
Avertissement SQL Avertissement émis par le SGBD

Exemples d'erreurs

Si une erreur s'est produite au stade de l'application serveur, elle ne peut généralement être enregistrée qu'ensuite, puis traitée plus en détail. Mais si cela s'est produit alors que l'application était en cours d'exécution sur l'ordinateur du programmeur, vous devez alors en rechercher soigneusement la raison.

Il existe deux grandes catégories d'erreurs lors de l'utilisation d'une base de données :

  • Erreur de texte de demande
  • Erreur lors de l'utilisation de ResultSet

Une erreur dans le texte de la requête peut se produire très souvent. La requête peut être très longue, contenir plusieurs tables (jointes via JOIN) et des sous-requêtes (SUBSELECT). Il n'est pas facile de trouver une erreur dans une telle demande. De plus, les demandes sont souvent collées à partir de pièces, des données y sont ajoutées.

La toute première erreur dont vous devez être conscient est SQLSyntaxErrorException . Une telle erreur signifie généralement que vous avez une faute de frappe dans le corps de la requête.

Prenons notre exemple préféré :

ResultSet results = statement.executeQuery("SELECT Count(*) FROM user");
results.next();
    int count = results.getInt(1);

Et supprimez "accidentellement" l'astérisque dans le corps de la requête :

ResultSet results = statement.executeQuery("SELECT Count() FROM user");
results.next();
    int count = results.getInt(1);

Ensuite, nous aurons une exception :

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)

Le serveur SQL nous indique qu'il y a eu une erreur de syntaxe avant FROM.

Nous examinons attentivement la demande et réfléchissons. Si rien ne vous vient à l'esprit, et cela arrive très souvent, vous devez demander à quelqu'un de regarder ce qui ne va pas.

Une autre erreur courante est le travail incorrect avec ResultSet - le résultat de la requête. Supposons que vous ayez oublié qu'avant de lire les données, la « ligne courante » de l'objet ResultSet vient avant la première ligne, alors vous aurez le code suivant :

ResultSet results = statement.executeQuery("SELECT Count(*) FROM user");
//    results.next();
    int count = results.getInt(1);

Vous obtiendrez cette erreur :


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)

Nous examinons attentivement l'erreur et réfléchissons. Ensuite, nous cherchons sur Google et trouvons quelques exemples et essayons de comprendre la solution.