Aller au contenu
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

verification de creation de tables + JDBC


Messages recommandés

Posté(e)

Bonjour a tous,

 

j'aurais besoin d'un peu d'aide en Java. en fait, voici mon probleme.

j'ai ecris un script de creation de table...jusque la, pas de probleme. ce que j'aimerais c'est verifier si mes tables sont bien creees. j'ai donc bien une fonciton de connexion a la base de donnees, une fonciton de deconnexion et une fonciton de creation des tables.

ce qui ne fonctionne pas ce sont les methodes de verification. les voici :

 

 protected static void verifierTables(Connection cnx)throws SQLException{

	if(!verifierTables(cnx,"Crosstbl")){
		createTables();
		System.out.println();
		System.out.println("Creation des tables reussie");
	}
	else{
		System.out.println("Tables deja crees");
	}
}

/**
 * Verifie si la table existe deja dans la base de donnees
 */
protected static boolean verifierTables(Connection cnx,String tbl)throws SQLException{

	//Recherche les informations concernant la DB
	DatabaseMetaData info = cnx.getMetaData();

	//Recherche les info concernant les tables,si la table existe, la methode 
	//renvoie au moins un enregistrement
	ResultSet rs = info.getTables(cnx.getCatalog(),null,tbl,null);
	boolean tblExists = rs.next();

	rs.close();

	return tblExists;
}//end verifierTables

 

lorsque je cree mes table la premiere fois, pas de probleme mais si je re-execute la fonction, a la place de me dire que mes foncitons sont deja creees, j'ai un message d'erreur me disant que ma table Crosstbl existe ( ce qui est vrai..) et ca recree la fonction. j'ai remarque que le probleme vient de la seconde methode, je dois faire une erreur dedans car le booleen tblExists ne passe jamais a true. il reste toujours a false que mes tables soient creees ou non et c'est ce qui fait que ca ne foncitonne pas.

 

quelqu'un pourrait il m'aide et me dire ce qui ne foncitonne pas dans mon implementation ? j'espere que mon explication est comprehensible...

 

merci d'avance.

Posté(e)

Tu utilises quel driver JDBC ? (certains drivers ne supportent pas l'appel à Connection.getMetaData() ...)

si je re-execute la fonction,(...) j'ai un message d'erreur
Quel est ce message, exactement ?
... et ca recree la fonction
Pardon ? Ca recrée... quoi ? Il n'y a rien de créé dans les méthodes que tu nous montres ici. Es-tu certain que l'erreur provient d'une de ces fonctions ?

As-tu un débugger à disposition pour tester ce qui est contenu dans le ResultSet lors de la recherche de la table ?

Posté(e)

J'utilise PostgreSQL

 

en fait j'ai laisse des trace dans mon code ce qui me permet de verifier tout cela. le message d'erreur est en fait le message du compilateur me donnant l'SQLException qui est en fait que ma table est deja creee et qui me renvoie au fonctions que j'ai donne precedemment.

 

pour la seconde remarque, je me suis mal exprime...en fait, c'est ma table qui est recreee..je veux dire par la que le compilateur m'affiche (toujours grace a une de mes traces) ma ligne de creation de table puis le message se trouvant dans ma fonction " verifierTables(connection cnx) " qui dit que les tables sont creees. il n'y a rien de cree dans les methode qui se trouvent dans mon poste car il deviendrait un peu long j'ai donc opte pour un raccourci et mis uniquement la partiequi comportait mon probleme. mais j'ai bien un script de creation de table, et une fonction de connection qui fait appel a verifier tables ( lui meme faisant appel a createTables -> fonction qui utilise le script de creation de table).

Posté(e) (modifié)

oui la casse est respectee et la version de mon driver est la 8.1.404 JDBC3.

 

donnez moi quelques minutes, je vous mets mon code sur une page comme ca vous le verez entierement.

 

-- edit --

voila ! : http://rafb.net/p/4g9Gtn89.html

 

Et voila mon message d'erreur :

 

Driver charge
Connexion ouverte
org.postgresql.util.PSQLException: ERROR: relation "crosstbl" already exists
	at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1512)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1297)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:188)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:430)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:332)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:278)
CREATE TABLE Crosstbl ( Cr_Id SERIAL NOT NULL, Po_Id INTEGER NOT NULL, Ress_Id INTEGER NOT NULL );
Creation des tables reussie
Connexion fermee
	at pkgSelfPlan.DBConnection.createTables(DBConnection.java:193)
	at pkgSelfPlan.DBConnection.verifierTables(DBConnection.java:101)
	at pkgSelfPlan.DBConnection.openConnection(DBConnection.java:62)
	at pkgSelfPlan.DBConnection.main(DBConnection.java:265)
BUILD SUCCESSFUL (total time: 2 seconds)

Modifié par KewlCat
Posté(e)

J'ai ajouté la balise

 dans ton post pour que le code soit plus lisible...

 

Au passage, le message d'erreur me semble étrange : le code fait certaines choses dans un ordre alors que le message montre qu'elles ont été exécutées dans un autre ordre, il y a des mélanges entre rapports d'exceptions et messages [i]System.out.println()[/i] (chose qui semble incompatible avec ce qu'est censé faire le programme en cas d'exception), et il se termine par un "BUILD SUCCESSFUL" (!?) qui est habituellement associé à la compilation, et non à l'exécution.

 

Es-tu bien certain de ne pas avoir supprimé des passages importants du code, en tentant de masquer certaines informations ? (p.ex. l'url de connexion, le user et le password....)

A propos de masquer certaines informations, tout le code mort nuit à la lisibilité du code ... ;-)

Posté(e)

Non, je n'ai rien cache du tout, tout est la. les string de connexion font partie d'une autre classe....mais tout le code que j'ai ecrit jusqu'a maintenant est la. il me semble bien a moi aussi qu'il y a un petit melange quelque part. selon moi, le probleme vient de la methode verifierTables qui possede 2 parametres. quoi qu'il arrive, le booleen ne passe jamais a true. donc je suppose qu'une des instructions de cette methode n'est pas correcte.

 

merci de votre interet pour mon probleme.

Posté(e)

Ah ok...

J'en déduis donc que url, usrName et usrPwd sont des attributs hérités de la superclasse DBParam... C'est assez surprenant de les voir intervenir "sortis de nulle part", c'est pour ça ;-)

 

D'après ce que je vois, la méthode verifierTables(Connection, String) me semble correcte...

quoi qu'il arrive, le booleen ne passe jamais a true
Comment es-tu arrivé à cette conclusion ? Débugger ?

Si tu as un débugger, t'est-il possible de regarder ce que contiennent les rows du ResultSet lorsque ce dernier devrait être vide ?

 

merci de votre interet pour mon probleme
On est là pour ça ;-)

(Au passage, si c'est à moi que tu t'adresses, sache que la règle veut que l'on se tutoie lors d'échanges sur le Net)

Posté(e) (modifié)
Ah ok...

J'en déduis donc que url, usrName et usrPwd sont des attributs hérités de la superclasse DBParam... C'est assez surprenant de les voir intervenir "sortis de nulle part", c'est pour ça :P

 

D'après ce que je vois, la méthode verifierTables(Connection, String) me semble correcte...

Comment es-tu arrivé à cette conclusion ? Débugger ?

Si tu as un débugger, t'est-il possible de regarder ce que contiennent les rows du ResultSet lorsque ce dernier devrait être vide ?

 

On est là pour ça :P

(Au passage, si c'est à moi que tu t'adresses, sache que la règle veut que l'on se tutoie lors d'échanges sur le Net)

 

 

desole pour ma reponse tardive, j'ai du m'absenter cet apres midi.

 

donc reprenons... oui , pour DBParam...c'est correct. pour ce qui est de "verifierTables(Connection,String) " ca me parait correct aussi , c'est ca que je ne comprends pas. j'en suis arrive a la conclusion que mon booleen ne passe pas a true grace aux differentes trace que j'ai laisse dans cette methode...trace qui ne se trouvent pas dans le code que j'ai donne, je les ai retirees avant d'ecrire mon post. en fait je faisais ceci :

 

protected static boolean verifierTables(Connection cnx,String tbl)throws SQLException{

       //Recherche les informations concernant la DB
       DatabaseMetaData info = cnx.getMetaData();

       //Recherche les info concernant les tables,si la table existe, la methode
       //renvoie au moins un enregistrement
       ResultSet rs = info.getTables(cnx.getCatalog(),null,tbl,null);
       boolean tblExists = rs.next();

System.out.println(rs.next());
System.out.println(tblExists);

       rs.close();

       return tblExists;
   }//end verifierTables

 

 

en faisant ca, "tblExists" reste "false" que les tables soient creees ou pas mais le probleme est que si je suis bien mon code, "tblExists" doit passer a "true" lorsqu'une table est "rencontree". maintenant, pour le debugger...en fait, j'avoue que c'est une grave erreur mais...je n'ai pas utilise le debugger, j'utilise netbeans. je vais essaye de voi comment faire ca mais ...

mes traces sont suffisantes non ? :P

 

merci encore a ...TOI...puisque c'est l'usage.

Modifié par C.J.
  • Modérateurs
Posté(e)

C.J., lorsque tu réponds au post juste précédent, pourquoi le répéter en citation, puisque le lecteur l'a déjà naturellement sous les yeux ? Au bouton p_quote.gif préfère le bouton t_reply.gif qui est juste au-dessous :P

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.
Remarque : votre message nécessitera l’approbation d’un modérateur avant de pouvoir être visible.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...