FAQ JDBCConsultez toutes les FAQ

Nombre d'auteurs : 8, nombre de questions : 162, dernière mise à jour : 3 juin 2015  Ajouter une question

 

Cette FAQ a été réalisée à partir des questions fréquemment posées sur les forums de http://www.developpez.com et de l'expérience personnelle des auteurs.

Nous tenons à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose sont correctes. Les auteurs font leur maximum, mais l'erreur est humaine. Cette FAQ ne prétend pas non plus être complète. Si vous trouvez une erreur, ou que vous souhaitez nous aider en devenant rédacteur, lisez ceci.


SommaireLa gestion des erreurs (4)
précédent sommaire suivant
 

La plupart des méthodes de l'API JDBC sont susceptibles de lever une SQLException. En plus de la méthode getMessage, disponible pour tous les types d'exception, cette classe fournit trois autres méthodes importantes :

  • getErrorCode() : retourne un entier représentant le code de l'erreur. Ce code est spécifique à chaque distributeur (Driver) ;
  • getSQLState() : retourne une chaîne de caractères représentant le « SQLState » de l'erreur. Cet état est défini par une des deux conventions : XOPEN ou SQL99 ;
  • getNextException() : retourne une possible SQLException liée à l'instance.

Voici un exemple :

Code java : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
try{ 
   //code susceptible de lever une SQLException 
}catch(SQLException sqle){ 
   System.out.println("Exception SQL : "); 
   while (sqle != null) { 
      String message = sqle.getMessage(); 
      String sqlState = sqle.getSQLState(); 
      int errorCode = sqle.getErrorCode(); 
      System.out.println("Message = "+message); 
      System.out.println("SQLState = "+sqlState); 
      System.out.println("ErrorCode = "+errorCode); 
      sqle.printStackTrace(); 
      sqle = sqle.getNextException(); 
   } 
} 
finally{ 
   //etc. 
}
On peut aussi spécifier la prochaine SQLException grâce à la méthode setNextException. Par exemple :

Code java : Sélectionner tout
1
2
3
4
5
6
7
8
9
public void maMethode() throws SQLException{ 
   try{ 
      //du code pouvant lever une SQLException 
   }catch(SQLException sqle){ 
      SQLException monException = new SQLException("monMessage"); 
      monException.setNextException(sqle); 
      throw monException; 
   } 
}

Mis à jour le 11 avril 2013 Ioan

La classe SQLWarning étend SQLException. Elle représente une erreur durant la connexion à la base, durant l'exécution d'une instruction ou durant la récupération de données contenues dans un ResultSet. Au contraire de SQLException, cette erreur n'est pas « fatale » au programme : l'exception n'est pas levée, mais simplement stockée. Par conséquent, il faut récupérer soi-même les warnings. La méthode getWarnings est disponible pour Connection, Statement et ResultSet. En voici les particularités :

  • Connection : la méthode getWarnings retourne le premier warning relatif à cette Connection. Si la connexion est fermée, une SQLException est levée ;
  • Statement : la méthode getWarnings retourne le premier warning relatif à ce Statement. Si un ResultSet est en train d'être lu, les warnings relatifs à celui-ci sont ajoutés à la liste. Les warnings sont remis à zéro à chaque exécution du Statement. Si le Statement est fermé, une SQLException est levée ;
  • ResultSet : la méthode getWarnings retourne le premier warning relatif à ce ResultSet. La liste des warnings est remise à zéro à chaque lecture de ligne. Si le ResultSet est fermé, une SQLException est levée.

Voici un exemple :

Code java : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
try{ 
   Class.forName("nom.du.Driver").newInstance(); 
   String url = "jdbc:..."; 
   String user = "user"; 
   String password = "mdp"; 
   Connection connection = DriverManager.getConnection(url,user,password); 
   //étude des warnings relatifs à la connexion 
   SQLWarning warning = connection.getWarnings(); 
   printWarning(warning); 
   //exécution d'un statement 
   Statement statement = connection.createStatement(); 
   ResultSet resultat = statement.executeQuery("une requête"); 
   //étude des warnings relatifs à l'exécution de l'instruction 
   warning = statement.getWarnings(); 
   printWarning(warning); 
   while(resultat.next()){ 
      //étude des warnings relatifs au ResultSet 
      warning = resultat.getWarnings(); 
      printWarning(warning); 
      //traitement des infos 
   } 
} catch(SQLException sqle){ 
   //traitement des exceptions 
}
Et voici le corps de la méthode printWarning qui permet juste d'afficher sur la sortie standard les informations sur le SQLWarning passé en paramètre.

Code java : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public void printWarning(SQLWarning warning) throws SQLException{ 
    if(warning==null){ 
       System.out.println("Bonne nouvelle, il n'y a pas de warning."); 
       return; 
    } 
    while(warning!=null){ 
       String message = warning.getMessage(); 
       String sqlState = warning.getSQLState(); 
       int errorCode = warning.getErrorCode(); 
       System.out.println("Message = "+message); 
       System.out.println("SQLState = "+sqlState); 
       System.out.println("ErrorCode = "+errorCode); 
       warning.printStackTrace(); 
       warning = warning.getNextWarning(); 
    } 
}
Remarque : on peut explicitement nettoyer les warnings (pour les trois classes) grâce à la méthode clearWarnings.

Mis à jour le 11 avril 2013 Ioan

DataTruncation étend SQLWarning. Mais à la différence de sa classe mère, DataTruncation est susceptible d'être levée (comme toute exception).

  • Warning : pour une lecture de données.
  • Exception : pour une écriture de données.

On peut facilement identifier une DataTruncation par son SQLState qui est 01004. Par contre, sachant qu'aucune méthode ne renvoie une instance de DataTruncation, il sera nécessaire de faire un cast. Par exemple :

Code java : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
} catch(SQLException sqle){ 
   System.out.println("Exception SQL : "); 
   while (sqle != null) { 
      String message = sqle.getMessage(); 
      String sqlState = sqle.getSQLState(); 
      int errorCode = sqle.getErrorCode(); 
      System.out.println("Message = "+message); 
      System.out.println("SQLState = "+sqlState); 
      System.out.println("ErrorCode = "+errorCode); 
      if(sqle instanceof DataTruncation){ 
         //on fait ici la vérification sur la classe et non sur le SQLState 
         //car la spécification n'est pas toujours suivie à la lettre 
         DataTruncation dt = (DataTruncation)sqle; 
         System.out.println("Taille qui aurait dû être transférée (bytes) : "+dt.getDataSize()); 
         System.out.println("Taille effectivement transférée (bytes) : "+dt.getTransferSize()); 
         //etc. 
      } 
      sqle = sqle.getNextException(); 
   } 
}

Mis à jour le 11 avril 2013 Ioan

Il n'existe pas de méthode toute faite dans l'API JDBC pour connaître la définition exacte d'un SQLState ou d'une ErrorCode. La seule information intéressante que l'on peut obtenir est la convention du SQLState. Pour cela, il faut utiliser DatabaseMetaData :

Code java : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
Connection connection = ...;  
DatabaseMetaData dmd = connection.getMetaData(); 
int type = dmd.getSQLStateType(); 
String sType = ""; 
if(type == DatabaseMetaData.sqlStateSQL99){ 
   sType = "SQL99"; 
} 
if(type == DatabaseMetaData.sqlStateXOpen ){ 
   sType = " XOPEN"; 
} 
System.out.println("Les SQLState suivent la norme "+sType);
Pour le reste, il faut se renseigner auprès du distributeur pour connaître la signification exacte d'un ErrorCode. Pour SQLState, il faut faire les vérifications en fonction de la norme utilisée.

Mis à jour le 11 avril 2013 Ioan

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2017 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

 
Responsables bénévoles de la rubrique Java : Mickael Baron - Robin56 -