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.


SommaireDivers (4)
précédent sommaire
 

L'interface ParameterMetaData permet d'obtenir des informations sur les paramètres d'un PreparedStatement. 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
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
String sql = "..."; 
PreparedStatement statement = connection.prepareStatement(sql); 
ParameterMetaData metadata = statement.getParameterMetaData(); 
for(int i=0; i<metadata.getParameterCount(); i++){ 
   String classe = metadata.getParameterClassName(i);  
   int mode = metadata.getParameterMode(i); 
   String sMode = ""; 
   switch(mode){ 
     case ParameterMetaData.parameterModeIn: 
        sMode = "IN"; 
        break; 
     case ParameterMetaData.parameterModeOut: 
        sMode = "OUT"; 
        break;    
     case ParameterMetaData.parameterModeInOut: 
        sMode = "INOUT"; 
        break;    
     case ParameterMetaData.parameterModeUnknown: 
        sMode = "inconnu"; 
        break;    
     default : sMode = "bug!!!";break;    
   } 
   int type = metadata.getParameterType(i);  
   String sType = metadata.getParameterTypeName(i);  
   int precision = metadata.getPrecision(i);  
   int scale = metadata.getScale(i);  
   int nullable = metadata.isNullable(i);  
   String sNullable = ""; 
   switch(nullable){ 
     case ParameterMetaData.parameterNoNulls: 
        sNullable = "ne peux pas être NULL"; 
        break; 
     case ParameterMetaData.parameterNullable: 
        sNullable = "peux être NULL"; 
        break;    
     case ParameterMetaData.parameterNullableUnknown: 
        sNullable = "inconnu"; 
        break;    
     default : sNullable = "bug!!!";break;    
   } 
   boolean sign = metadata.isSigned(i); 
   System.out.println("INFORMATIONS SUR LE PARAMETRE D'INDEX "+i); 
   System.out.println("Classe java = "+classe); 
   System.out.println("Mode = "+mode+" : "+sMode); 
   System.out.println("Type dans java.sql.Types = "+type); 
   System.out.println("Nom du type = "+sType); 
   System.out.println("Précision = "+precision); 
   System.out.println("Scale = "+scale); 
   System.out.println("Nullable = "+nullable+" : "+sNullable); 
   System.out.println("Signé = "+sign); 
}
Attention, il ne faut pas confondre getParameterMetaData et getMetaData. La seconde méthode permet de récupérer les métadonnées des ResultSet produits par le PreparedStatement. Ces métadonnées sont récupérées sous forme de ResultSetMetaData.

Mis à jour le 11 avril 2013 Ioan

Il n'existe pas de mécanisme standard à JDBC pour connaître quelles sont les requêtes envoyées au SGBD. Certains drivers redéfinissent les méthodes toString() (pour Statement, PreparedStatement ou CallableStatement). Mais, il est difficile de faire une application « portable » dans ces conditions.

Heureusement, il existe une API pouvant aider à surveiller les requêtes envoyées au SGBD : P6SPY.
Cette API définit en fait un « driver » qui va englober le driver réel. Pour plus d'informations, regardez la documentation de P6SPY.

Mis à jour le 11 avril 2013 Ioan

Malheureusement, non, il n'existe pas de manière générique pour créer une base de données avec JDBC. En fait JDBC est obligé d'avoir une base de données à laquelle se connecter pour pouvoir travailler.

Il existe tout de même une possibilité : il faut utiliser une Connection factice qui servira de pont entre vous et le SGBD. À partir de cette Connection, vous pourrez exécuter une instruction spécifique au SGBD pour créer une autre base de données.

Voici une méthode qui permet de créer une base de données MySql et d'obtenir une Connection à celle-ci :

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
public static Connection createMysqlDatabase(Connection factice, String user,  
                                             String pass, String nomBase)  
                                             throws SQLException{ 
   Connection connection = null; 
   Statement statement = null; 
   try{ 
      statement = factice.createStatement(); 
      statement.execute("CREATE DATABASE "+nomBase); 
      String url = factice.getMetaData().getURL(); 
      url = url.substring(0,url.lastIndexOf("/")); 
      url += "/"+nomBase; 
      connection = DriverManager.getConnection(url,user,pass); 
   }catch(SQLException e){ 
      SQLException sqle = new SQLException("Création de la base impossible"); 
      sqle.setNextException(e); 
      throw sqle; 
   }finally{ 
      try{statement.close();}catch(Exception e){} 
   } 
   return connection; 
}
Vous pouvez utiliser cette méthode comme ceci :

Code java : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
Class.forName("com.mysql.jdbc.Driver"); 
String url = "jdbc:mysql://host/baseLien"; 
String user = "user"; 
String pass = "password"; 
// on commence par se connecter à la base factice 
Connection factice = DriverManager.getConnection(url,user,pass); 
// on crée la base et on récupère une Connection 
Connection connection = createMysqlDatabase(factice,user,pass,"NouvelleBase"); 
// on peut finalement fermer notre Connection factice qui ne nous sert plus à rien 
factice.close();

Mis à jour le 11 avril 2013 Ioan

Il suffit d'utiliser l'URL suivante :

Code java : Sélectionner tout
jdbc:odbc:;DRIVER=Microsoft Access Driver (*.mdb);DBQ=labase.mdb;
Bien entendu, à la place de « labase », mettez le chemin complet de votre base (par exemple c:/temp/labase.mdb).

Voici un exemple complet de code pour obtenir une Connection :

Code java : Sélectionner tout
1
2
3
4
5
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
String url= "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:/temp/thebase.mdb"; 
String user = "user"; 
String pass = "pass"; 
Connection connection = DriverManager.getConnection(url,user,pass);

Pour fonctionner avec Java 64 bit, il est nécessaire de disposer des drivers Access 2010 en version 64 bit (Microsoft Access Database Engine 2010 Redistributable). Ceux-ci sont incompatibles avec une version 32 bit de la suite Office.

Mis à jour le 11 avril 2013 duj ptitom

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
 

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 -