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.
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. } |
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; } } |
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 } |
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(); } } |
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(); } } |
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); |
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 çaLes 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 © 2024 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.