Objets JDBC

Fermé
Evangelion - 26 juil. 2002 à 00:23
 Evangelion - 7 août 2002 à 22:06
Quelqu'un a-t-il essayé de créer et d'utiliser les objets JDBC proposés dans l'article "Création d'objets JDBC de plus haut niveau" du site ?

L'objet Database proposé me semble comporter des erreurs. J'ai également essayé de créer l'objet resultSet suggéré mais j'ai des problèmes avec les métadonnées.

N'ayant obtenu aucune réponse des auteurs de l'article, je pose la question ici.

7 réponses

Pour commencer, la classe Database proposée est pleine d'erreurs :
- le tableau "type" contenant "TABLES" au lieu de "TABLE"
- la variable dma s'appelle dm lors de la déclaration
- les "import" manquent
- ...

Voici celle que je propose :
(j'ai effectué quelques améliorations par rapport à celle proposée)


import java.sql.*;
import java.io.*;
import java.util.*;

public class Database {
private
Connection cnt;
DataSet results;
ResultSetMetaData rsmd;
DatabaseMetaData dma;
String[] types;
String productName;
String productVersion;

public Database(String driver) {
types = new String[1];
types[0] = "TABLE";
try {
Class.forName(driver);
}
catch(Exception e){
System.out.println("Erreur lors du chargement du driver: "+ e.getMessage());
}
}

public void open(String url, String username, String password){
try{
cnt = DriverManager.getConnection(url, username, password);
dma = cnt.getMetaData();
productName = dma.getDatabaseProductName();
productVersion = dma.getDatabaseProductVersion();
results = new DataSet(dma.getCatalogs());
String s[] = null;
while(results.hasMoreElements()) {
s = results.nextElement();
}
}
catch(Exception e){
System.out.println("Echec d'ouverture: "+e.getMessage());
}
}

public void close(){
try{
cnt.close();
}
catch(Exception e){
System.out.println("Erreur lors de la fermeture: "+e.getMessage());
}
}

public String[] getTableNames(){
String[] tbnames = null;
Vector tname = new Vector();

try{
results = new DataSet(dma.getTables(null, null, null, types ));
while (results.hasMoreElements())
tname.addElement(results.getColumnValue("TABLE_NAME"));
}
catch(Exception e){
System.out.println(e.getMessage());
}
tbnames = new String[tname.size()];
for(int i=0;i<tname.size();i++)
tbnames[i] = (String)tname.elementAt(i);
return tbnames;
}

public String[] getTableMetaData(){
results = null;

try{
results = new DataSet(dma.getTables(null, null, "%", types ));
}
catch(Exception e){
System.out.println(e.getMessage());
}
return results.getMetaData();
}

public String[] getColumnMetaData(String tablename){
results = null;

try{
results = new DataSet(dma.getTables(null, null, tablename, null));
}
catch(Exception e){
System.out.println(e.getMessage());
}
return results.getMetaData();
}

public String[] getColumnNames(String table){
String[] tbnames = null;
Vector tname = new Vector();

try{
results = new DataSet(dma.getColumns(null, null, table, null));
while (results.hasMoreElements())
tname.addElement(results.getColumnValue("COLUMN_NAME"));
}
catch(Exception e){
System.out.println(e.getMessage());
}
tbnames = new String[tname.size()];
for(int i=0;i<tname.size();i++)
tbnames[i] = (String)tname.elementAt(i);
return tbnames;
}

public void getColumnValue(String table, String columnName){
try{
if (table.length()>0)
results = executeQuery("Select "+columnName+" from "+table+" order by "+columnName);
}
catch(Exception e){
System.out.println("Erreur sur la valeur de la colonne "+columnName+e.getMessage());
}
}

public String getNextValue(String columnName){
String res = "";
try{
if (results.hasMoreElements())
res = results.getColumnValue(columnName);
}
catch(Exception e){
System.out.println("Erreur sur la valeur suivante "+columnName+e.getMessage());
}
return res;
}

public DataSet executeQuery(String sql){
results = null;
try{
Statement stmt = cnt.createStatement();
results = new DataSet(stmt.executeQuery(sql));
}
catch(Exception e){
System.out.println(e.getMessage());
}
return results;
}

public void executeUpdate(String sql){
try{
Statement stmt = cnt.createStatement();
stmt.executeUpdate(sql);
}
catch(Exception e){
System.out.println(e.getMessage());
}
}

public String getProductName(){
return productName;
}

public String getProductVersion(){
return productVersion;
}
}

Je me suis ensuite attaqué à la classe resultSet, que j'ai renommé DataSet, pour éviter toute confusion... Comme indiqué un objet DataSet encapsule le ResultSet et définit des méthodes pour pouvoir l'utiliser plus facilement.

import java.sql.*;


public class DataSet {
ResultSet results;
ResultSetMetaData rsmd;
int columnCount;

public DataSet(ResultSet results) {
try{
this.results = results;
rsmd = results.getMetaData();
columnCount = rsmd.getColumnCount();
}
catch (SQLException ex){
}
}
public boolean hasMoreElements() {
try{
return results.next();
}
catch (SQLException ex){
return false;
}
}
public String[] nextElement() {
String[] line;
line = new String[columnCount+1];
try{
for (int i = 1; i <= columnCount; i++){
line[i] = results.getString(i);
}
}
catch (SQLException ex){
}
return line;
}

public String getColumnValue(String columnName){
String columnValue="";
try{
columnValue = results.getString(columnName);
}
catch (SQLException ex){
System.out.println(ex.getMessage());
}
return columnValue;
}

public String[] getMetaData(){
String[] s;
s = new String[columnCount+1];
try{
rsmd = results.getMetaData();
for (int i=1; i <= columnCount; i++){
s[i] = rsmd.getColumnName(i);
}
}
catch (Exception ex){
System.out.println(ex.getMessage());
}
return s;
}

public int getColumnCount(){
return columnCount;
}
}

J'ai essayé de rester le plus fidèle à l'interface attendue dans la classe Database, même si cela donne quelques incohérences :
ma méthode hasMoreElement se base sur le fait que la méthode "next()" d'un résultSet renvoie TRUE s'il existe un élément suivant et FALSE dans le cas contraire. De ce fait, si l'on fait :
If results.hasMoreElement()
le resultSet se déplace sur la ligne suivante et la méthode "nextElement()" se contente de lire la ligne et de la renvoyer...
(j'ai essayé une autre solution mais elle n'était pas très élégante non plus)

Cela semble fonctionner correctement mais j'avoue que je n'ai pas trop su quoi faire avec la méthode "getMetaData" du resultSet/DataSet. La méthode que je propose renvoie le nom des colonnes du ResultSetMetaData, avec lesquelles on peut peut-être faire des recherches... Ce point est évidemment à revoir...

Enfin je me suis posé une question : l'interface du DataSet/ResultSet ressemble à l'interface Enumération (qui propose 2 méthodes, hasMoreElement() et nextElement() ). Je n'ai pas implémenté l'interface Enumeration ici car la méthode nextElement() doit donner un objet et non un tableau, mais c'est peut-être une idée.

Je suis conscient que ce que je propose n'est pas complet et comporte quelques incohérences. N'hésitez pas à me dire ce que vous en pensez. Je suis ouvert à toute suggestion...
1
choubaka
Messages postés
39005
Date d'inscription
jeudi 4 avril 2002
Statut
Modérateur
Dernière intervention
13 mai 2022
2 076
26 juil. 2002 à 08:01
quels genres de prob?

Chouba
"Obsédé des travaux manuels non pratiquant"
0
Salut,
moi j' ai rencontré egalement des pbs; D'abord il faut constituer une classe resultSet que je n' arrive pas a faire(si tu as un code met le sur le forum) et je pense qu' il y a peut etre un pb avec la declaration DatabaseMetaData dm .
@+
0
choubaka
Messages postés
39005
Date d'inscription
jeudi 4 avril 2002
Statut
Modérateur
Dernière intervention
13 mai 2022
2 076
5 août 2002 à 13:48
Salut, vu que ça risque d'être long

http://java.sun.com/docs/books/tutorial/jdbc/basics/complete.html

c'est assez bien fait mais en anglais, bon..

Chouba
"Obsédé des travaux manuels non pratiquant"
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Merci Choubaka,
mais ceci ne m' apporte pas la solution du comment faire pour que la classe DataBase livrée par CCMI soit correctement compilée.
Alors peut etre qu' en faisant un effort tu pourrais en dire +
@+
0
choubaka
Messages postés
39005
Date d'inscription
jeudi 4 avril 2002
Statut
Modérateur
Dernière intervention
13 mai 2022
2 076
6 août 2002 à 08:37
Donne moi le message d'erreur du compilateur
en général, c'est assez explicite

Chouba
"Obsédé des travaux manuels non pratiquant"
0
Salut tt le monde,

Ah et bien la cela me parait + clair.

@+
0
Si tu as des suggestions d'améliorations, n'hésites pas...
0