[debutant] tableau java

tableau java [debutant] - Java - Programmation

Marsh Posté le 18-02-2005 à 16:35:49    

Je debute en java et je souhaite simplement remplir un tableau avec le résultat d'une requete SQL. J'utilise le code suivant
 

Code :
  1. Statement stmt = connection.createStatement();
  2.                            ResultSet rset = stmt.executeQuery ("SELECT prenom, nom FROM t_test" );
  3.                            data = new Object[rset.getFetchSize()][2];
  4.                            int i = 1;
  5.                            while (rset.next()) {
  6.                                System.out.println(rset.getString(1) + " " + rset.getString(2));
  7.                                data[i][1] = rset.getString(1);
  8.                                data[i][2] = rset.getString(2);
  9.                                i++;
  10.                            }


 
mais à l'execution j'ai toujours une exception java.lang.ArrayIndexOutOfBoundsException:  
 
Ma façon de remplir le tableau est elle mauvaise ?

Reply

Marsh Posté le 18-02-2005 à 16:35:49   

Reply

Marsh Posté le 18-02-2005 à 16:45:38    

Si tu définis un tableau à 2 éléments, les éléments accessibles sont les éléments 0 et 1, pas 1 et 2

Reply

Marsh Posté le 18-02-2005 à 16:47:42    

en mettant  
les indices 0 et 1 voila ce que j'obtiens  :cry:  
 
java.lang.ArrayIndexOutOfBoundsException: 0

Reply

Marsh Posté le 18-02-2005 à 16:50:46    

Pareil pour i : i doit démarrer à 0, pas à 1 ...

Reply

Marsh Posté le 18-02-2005 à 16:51:35    

oui, j'avais changé les deux   :ange: donc je vois pas pourquoi ca marche pas


Message édité par ojbis le 18-02-2005 à 16:51:57
Reply

Marsh Posté le 18-02-2005 à 16:57:45    

Affiche rset.getFetchSize() pour voir et dis-m'en des nouvelles.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 18-02-2005 à 17:01:54    

oui mon fetchsize est à zéro ... pourtant quand je tape ma requete SQL ds la console mysql j'obtiens bien plusieurs résultats... je cherche de ce coté la et je rajoute ds mon code une condition sur fecth <> 0  :D


Message édité par ojbis le 18-02-2005 à 17:02:46
Reply

Marsh Posté le 18-02-2005 à 17:14:49    

Explique quand même l'interêt de mettre un resultset dans un tableau, à mon avis tu fais ça pour rien (sauf si c'est pour  l'amour de l'art :) )

Reply

Marsh Posté le 18-02-2005 à 17:17:12    

oui j'imagine qu'il doit y avoir un moyen plus propre et plus rapide donc mon but : afficher le résultat de ma requete dans une Jtable.
 
D'après ce que j'ai compris de la Javadoc je fais un AbstractTableModel avant de créer ma Jtable et mon AbstractTableModel contient un tableau à deux dimensions contenant le résultat de la requete.  
 
J'ai tout faux ?   :??: (Avec des valeurs statique saisie en dur dans le code à la place de la requete SQL ca fonctionne)


Message édité par ojbis le 18-02-2005 à 17:18:04
Reply

Marsh Posté le 18-02-2005 à 17:20:41    

1°- Comme le dit Glod, tu ne t'y prends probablement pas bien;
2°- Tu n'utilises de toute façon pas la bonne méthode : lis la javadoc sur setFetchSize et getFetchSize;
3°- et en plus, le driver est manifestement buggé.
 
Quel DBMS, quel driver ?


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 18-02-2005 à 17:20:41   

Reply

Marsh Posté le 18-02-2005 à 17:23:56    

mysql-connector-java-3.1.6-bin.jar pour mon driver vers Mysql et ds mon code :

Code :
  1. String nomDriver = "com.mysql.jdbc.Driver";
  2.         String url = "jdbc:mysql://localhost:3306/test";
  3.         String login = "root";
  4.         String password = "oj131080";
  5.         Connection connection = null;
  6.         Statement stmt;
  7.         Class.forName(nomDriver);
  8.         connection = DriverManager.getConnection(url,login,password);
  9.        
  10.         try{
  11.             stmt = connection.createStatement();
  12.             ResultSet rset = stmt.executeQuery("SELECT prenom, nom FROM t_test" );
  13.             if (rset.getFetchSize() > 0) {
  14.                 myTablemodel = new TableModel_Personnel(rset);
  15.             }
  16.         }
  17.         catch(SQLException sqle){
  18.                        //cf Comment gérer les erreurs ?
  19.                        System.out.println("Probleme a l'ouverture de la connection avec la base.<br>" );
  20.         }
  21.         catch(Exception e){
  22.                        System.out.println("Autre erreur : " );
  23.                        e.printStackTrace();
  24.         }
  25.         finally{
  26.                        // Fermeture de la connection
  27.                        if(connection!=null){
  28.                        try {connection.close();} catch(Exception e){e.printStackTrace();}}
  29.         }


 
Avec ce test sur le rset.getFetchSize() j'ai bien sure plus aucune erreur mais ma table est désespérement vide


Message édité par ojbis le 18-02-2005 à 17:25:35
Reply

Marsh Posté le 18-02-2005 à 17:28:04    

et tu sais ce que c'est getFetchSize() au moins?
tu esperes recuperer quoi là ?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 18-02-2005 à 17:29:25    

je veux recuperer le nombre de resultat de ma requete pour déclarer un tableau de la même taille.

Reply

Marsh Posté le 18-02-2005 à 17:30:09    

et tu sais ce que c'est getFetchSize() au moins? §§T4AS LU LA JAVADOC OU T4AS PRIS LA PREMIERE METHODE QUI ES TOMB2E SOUS L4AUTOCOMPLETION DE TON PUTAIN D4EDITEUR SANS TE DEMANDER SI C4ETAIT LA BONNE§§§???


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 18-02-2005 à 17:31:41    

et oh faut se calmer un peu la monsieur ! Je fais ce que je peux en parcourant la Javadoc. Bon de toute façon c'est le week end donc je verrai ca lundi. Merci à ceux qui m'ont aidé

Reply

Marsh Posté le 18-02-2005 à 17:39:36    

ojbis a écrit :

en parcourant la Javadoc


mon cul.


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 18-02-2005 à 17:50:58    


La javadoc étant en anglais, on peut se tromper...

Reply

Marsh Posté le 18-02-2005 à 22:15:23    

Sur le nainternet, Gougueule semble dire que getFetchSize() du draïver Maïessecuelle est buggé.
 
Et je ne sais pas comment tu as lu la javadoc, mais il paraît assez clair que ce n'est pas la bonne méthode.
 

Citation :

setFetchSize - Gives the JDBC driver a hint as to the number of rows that should be fetched from the database when more rows are needed for this ResultSet object.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 18-02-2005 à 22:15:52    

djok_fb a écrit :

La javadoc étant en anglais, on peut se tromper...


My ass.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 18-02-2005 à 23:33:20    

Sur l'interface ResultSet on ne dispose pas d'une methode permettant
de nous retourner le nombre d'enregistrements de celui-ci.
Il faut parcourir l'ensemble du ResultSet pour connaitre sa taille.
 
Par défaut un ResultSet obtenu par un connection.createStatement() est de type TYPE_FORWARD_ONLY et les méthodes comme last() et first() ne sont pas utilisables sur ce type de ResultSet.  
Regarde les autres méthodes createStatement de Connection et leurs paramètres pour obtenir des ResultSet avec d'autres fonctionnalités.

Reply

Marsh Posté le 19-02-2005 à 10:56:59    

Plutôt que de parcourir l'ensemble des rows, faire un
rs.last();
puis
int nbRow = rs.getRow();
nbRow contiendra le nombre d'enregistrements.
Y a 2 méthodes, soit on ouvre le statement en scroll insensitive et après ces 2 lignes on fait
rs.beforeFirst();
pour retourner au début et faire le traitement prévu.
Soit on ouvre le statement sans paramètre, on récupère le nombre de row en faisant la requète concernée avec un select allegé (qui ne renvoie qu'une colonne mais donc le where est le même), puis on close le resultset pour le réouvrir avec la requète complète.
 
A vous de faire les tests de perf, la 1ere méthode perd un peu de perf à cause du resultset scroll insensitive, la 2eme n'a pas ce blem mais oblige à faire 2 requètes (dont une très light)
A priori une requete à jointure complexe tournera mieux avec la 1ere méthode, une requète "light" avec la 2eme :)

Reply

Marsh Posté le 19-02-2005 à 14:33:52    

et faire tout simplement 2 requêtes? une avec un count() et l'autre avec les champs dont on a besoin ;)
 
Pour l'anglais, c'est un débutant, s'il faut, il a pas l'habitude lire de l'anglais informatique ;)
 
mais c'est vrai qu'on voit tout de suite que getFetchSize, c'est pas ça ;)

Reply

Marsh Posté le 19-02-2005 à 14:45:39    

En général (je dis bien en général), le count est moins perf, mais ça peut être une solution alternative à ma 2eme solution qui est aussi de faire 2 requètes.

Reply

Marsh Posté le 19-02-2005 à 14:49:42    

oui enfin bon, suffit d'utiliser une Collection au lieu d'une array hein...

Reply

Marsh Posté le 19-02-2005 à 17:58:25    

the real moins moins a écrit :

oui enfin bon, suffit d'utiliser une Collection au lieu d'une array hein...


+1, plutôt que de commencer avec des artifices inélégants genre COUNT ou de jouer des curseurs comme un DJ.
 
Note pour le COUNT : pour peu que l'accès DB soit lent, ça ne fera qu'aggraver les choses.


Message édité par sircam le 19-02-2005 à 17:58:36

---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 19-02-2005 à 19:50:13    

Oui enfin là c'était plus généralement pour compter le nb d'enregistrements d'un rs...


Message édité par glod 2 le 19-02-2005 à 19:50:59
Reply

Marsh Posté le 20-02-2005 à 18:37:52    

après vision de vos messages, je vois que certains sont toujours énervé pour je ne sais quelle raison  :??:  
Je n'ai donc pas utilisé la bonne méthode mais alors deux petites questions svp :  
 
1: getfecthsize dans la javadoc :  
"Retrieves the fetch size for this ResultSet object" donc ca renvoie quoi ?
 
2: comment je fais dans la théorie (je veux pas tout le code juste le principe) pour afficher le résultat d'une requete select dans un Jtable ?  :??: Puisque la méthode que j'utilise ne semble pas la bonne, trop lente et trop lourde (mais je m'en doutais quand même  :D )
 
Merci de m'aider un peu  :D


Message édité par ojbis le 20-02-2005 à 18:38:40
Reply

Marsh Posté le 21-02-2005 à 11:56:07    

ojbis a écrit :

après vision de vos messages, je vois que certains sont toujours énervé pour je ne sais quelle raison  :??:  
Je n'ai donc pas utilisé la bonne méthode mais alors deux petites questions svp :  
 
1: getfecthsize dans la javadoc :  
"Retrieves the fetch size for this ResultSet object" donc ca renvoie quoi ?
 
2: comment je fais dans la théorie (je veux pas tout le code juste le principe) pour afficher le résultat d'une requete select dans un Jtable ?  :??: Puisque la méthode que j'utilise ne semble pas la bonne, trop lente et trop lourde (mais je m'en doutais quand même  :D )
 
Merci de m'aider un peu  :D


 
1: Ca renvoie la taille (en ligne?) d'un fetch (une récupération de données). Je l'ai rarement vu (sous Oracle) valoriser à autre chose que 0.
Le fetch, c'est la récupération des données (un tuple, une ligne de données) lors de la lecture d'une requête via un curseur (PL/SQL par exemple). Le fetch, c'est un peu le next() du resultset (le resultset étant le curseur).
 
NB pour les puristes: J'ai simplifié pour tenter de pas trop le perdre (c'est un débutant)

Reply

Marsh Posté le 21-02-2005 à 12:07:40    

en fait c'est plus simple que ca.
 
Quand tu fais obtiens un resultset, tu n'as aucune donnée dedans. Quand tu fait un next(), il va rapatrier autant de lignes que ce qui est défini la dedans.
 
Au prochain next, il utilise une des lignes déjà rappatriées, jusqu'a ce qu'un next() nécéssite des données qui ne sont pas encore récupérées. On a alors un nouveau fetch.

Reply

Marsh Posté le 21-02-2005 à 13:00:05    

Excellente explication :jap:

Reply

Marsh Posté le 21-02-2005 à 14:10:04    

lorill a écrit :

en fait c'est plus simple que ca.
 
Quand tu fais obtiens un resultset, tu n'as aucune donnée dedans. Quand tu fait un next(), il va rapatrier autant de lignes que ce qui est défini la dedans.
 
Au prochain next, il utilise une des lignes déjà rappatriées, jusqu'a ce qu'un next() nécéssite des données qui ne sont pas encore récupérées. On a alors un nouveau fetch.


 
Donc par defaut il rappatrie ligne par ligne et si par exemple je met le fetch size à 2 il en rappatrie deux d'un coup et donc il fait le fetch que sur un next() sur deux ?  
 
Le résuletSet est la vision d'une ligne du résultat que l'on peut déplacer . Il recupère les données nécessaires quand on fait un next() par exemple, mais il les récupère ou ? La résultat de la requête est stockée dans un objet ?

Reply

Marsh Posté le 21-02-2005 à 14:14:36    

Le résultat de ton next est stocké dans ton resultset, après un next, tu fais un getField(int) (de 1 à xxx) ou getField("nom_champ" )...


Message édité par djok_fb le 21-02-2005 à 14:14:57
Reply

Marsh Posté le 21-02-2005 à 14:41:35    

Oui, j'ai compris que la méthode d'execution de la requete me renvoie un resultset qui permet d'acceder aux données via next() et getfields ... Mais quand on fait un next() les données sont "chargées" dans le resultset (accessible ensuite via getField("nom_champ" )) mais elles sont chargées d'où ?
 
 
       executeQuery()
BDDSQL ----------------> !----------!----------!
                         !   Nom    !  Prenom  !
                         !----------!----------!  
                         !  Martin  !  Jacques ! <- resultset.next()
                         !  Durand  !  Paul    !
                         !----------!----------!
 
En gros, le tableau est stockée dans le resulset ou dans un autre objet accessible via le resultset ?
 
edit: pourquoi mon tableau est plus aligné après avoir posté le message alors qu'il est tout beau quand je l'édite ?  :D


Message édité par ojbis le 21-02-2005 à 14:42:39
Reply

Marsh Posté le 21-02-2005 à 19:25:36    

Pour le stockage, ça dépend du driver (le truc que tu appelles avec forName("driver.nom.xxxx" ))...
 
En Java, les classes SQL sont des interfaces, c'est à dire qu'elles définissent un "squelette" que chaque développeur de driver devra utiliser pour être JDBC Compliant. Les méthodes ont une description générale de ce qu'elles doivent renvoyer comme résultat. ce qui fait que selon la base et le "fabricant" de ton driver, la façon de procéder est différente.


Message édité par djok_fb le 21-02-2005 à 19:25:49
Reply

Marsh Posté le 21-02-2005 à 19:36:16    

djok_fb a écrit :

Pour le stockage, ça dépend du driver (le truc que tu appelles avec forName("driver.nom.xxxx" ))...
 
En Java, les classes SQL sont des interfaces, c'est à dire qu'elles définissent un "squelette" que chaque développeur de driver devra utiliser pour être JDBC Compliant. Les méthodes ont une description générale de ce qu'elles doivent renvoyer comme résultat. ce qui fait que selon la base et le "fabricant" de ton driver, la façon de procéder est différente.


 
ok ce coup ci c'est bon j'ai tout compris !  :D  Merci !


Message édité par ojbis le 21-02-2005 à 19:36:35
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed