Flux rss
Rechercher : dans
Par :

Objets JDBC

Evangelion, le vendredi 26 juillet 2002 à 00:23:03 
 Signaler ce message aux modérateurs

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.

1

choubaka, le vendredi 26 juillet 2002 à 08:01:18

Quels genres de prob?

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

Répondre à choubaka

2

Androu, le lundi 5 août 2002 à 13:05:19

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 .
@+

Répondre à Androu

3

choubaka, le lundi 5 août 2002 à 13:48:17

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"

Répondre à choubaka

4

Androu, le lundi 5 août 2002 à 18:05:13

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 +
@+

Répondre à Androu

5

choubaka, le mardi 6 août 2002 à 08:37:15

Donne moi le message d'erreur du compilateur
en général, c'est assez explicite

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

Répondre à choubaka

6

Evangelion, le mardi 6 août 2002 à 19:43:54

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...

Répondre à Evangelion

7

Androu, le mercredi 7 août 2002 à 15:09:05

Salut tt le monde,

Ah et bien la cela me parait + clair.

@+

Répondre à Androu

8

 Evangelion, le mercredi 7 août 2002 à 22:06:40

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

Répondre à Evangelion
Création d'objets JDBC Création d'objets JDBC de plus haut niveau Puisque l'accès à une base de données nécessite l'utilisation conjointe de plusieurs objets, il peut être intéressant de créer quelques objets de plus haut niveau encapsulant la plupart des comportements... www.commentcamarche.net/contents/jdbc/jdbcobjets.php3
Connexion à la base de données avec JDBC Connexion à la base de données L'API (Application Programming Interface) JDBC, c'est-à-dire la bibliothèque de classes JDBC, se charge de trois étapes indispensables à la connexion à une base de données : la création d'une connexion à la... www.commentcamarche.net/contents/jdbc/jdbcconnect.php3
Javascript - L'objet String Les particularités de l'objet String string est un mot anglais qui signifie "chaîne", il s'agit en fait de chaîne de caractères. L'objet String est un objet qui contient un certain nombre de propriétés et de méthodes permettant la manipulation... www.commentcamarche.net/contents/javascript/jsstring.php3
VBA et les collections d'objets.VBA et les collections d'objets Quand plusieurs (beaucoup de) contrôles sont mis sur une feuille ou un Userform il est parfois fastidieux d'écrire du code dans chaque évènement des contrôles. Ce Tuto vous permet de traiter vos contrôles comme... www.commentcamarche.net/faq/sujet-10397-vba-et-les-collections-d-objets
Découper un objet de l'arrière planParfois on peut vouloir découper un objet de son arrière-plan, par exemple un visage, un fruit posé sur une table, etc. L'outil habituellement utilisé est le lasso, mais l'opération est délicate. On peut également utiliser des calques, mais dans... www.commentcamarche.net/faq/sujet-10311-decouper-un-objet-de-l-arriere-plan
Jeux d'objets cachés (Résolu)Bonjour, Ou trouver des jeux d'objets cachés en français, j'en ai fais plusieurs et j'en cherche d'autres Merci www.commentcamarche.net/forum/affich-5266469-jeux-d-objets-caches
Recherche d'autre jeux d'objets cachés (Résolu)Bonjour, j'ai jouets a tout les jeux d'objets cahés et jaimerer bien en jouet a d'autre m a télécharger gratuitement et en version française j'ai fait tou les sites merci d'avance d'avoir repondu www.commentcamarche.net/forum/affich-6581297-recherche-d-autre-jeux-d-objets-caches
[SIMS 2] Sites de téléchargements d'objets (Résolu)Salut à tous ! Voilà, connaisseriez vous des bons sites de téléchargements gratuits d'objets, de murs, de sols, de packs ... etc pour les sims 2 svp ? Encore merci pour vos réponses :) !!! www.commentcamarche.net/forum/affich-3184491-sims-2-sites-de-telechargements-d-objets
Déco et High-tech : 7 objets high-tech design pour le salon(Paris - Relax news) - Alors que le secteur de la décoration est en plein boom, de nombreuses enseignes dédiées aux nouvelles technologies renouvellent leur offre pour permettre aux consommateurs d'acquérir des objets high-tech design à intégrer dans... www.commentcamarche.net/actualites/deco-et-high-tech-7-objets-high-tech-design-pour-le-salon-5847442-actualite.php3
Créer ses propres objets déco sur Internet(Paris - Relax news) - Les designers en herbe ont dorénavant un site Internet leur permettant de créer des objets décoratifs selon leur imagination et de se les faire livrer quelques jours plus tard chez eux. Sur Shapeways.com, les internautes... www.commentcamarche.net/actualites/creer-ses-propres-objets-deco-sur-internet-5847822-actualite.php3
Javascript - L'objet windowLes particularités de l'objet window L'objet window est l'objet par excellence dans Javascript, car il est le parent de chaque objet qui compose la page web, il contient donc : l'objet document: la page en elle-même l'objet location: le lieu de... www.commentcamarche.net/contents/javascript/jswindow.php3
Javascript - L'objet RegExpLes particularités de l'objet RegExp L'objet RegExp est un objet permettant de manipuler des expressions régulières, c'est-à-dire des modèles créés à l'aide de caractères ASCII permettant de manipuler des chaînes de caractères, afin de trouver des... www.commentcamarche.net/contents/javascript/jsregexp.php3
Javascript - L'objet DateLes particularités de l'objet Date L'objet Date permet de travailler avec toutes les variables qui concernent les dates et la gestion du temps. Il s'agit d'un objet inclus de façon native dans Javascript, et que l'on peut toujours utiliser. La... www.commentcamarche.net/contents/javascript/jsdate.php3