Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1827 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  [debutant] tableau java

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[debutant] tableau java

n°986352
ojbis
Posté le 18-02-2005 à 16:35:49  profilanswer
 

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 ?

mood
Publicité
Posté le 18-02-2005 à 16:35:49  profilanswer
 

n°986380
dsls
Posté le 18-02-2005 à 16:45:38  profilanswer
 

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

n°986383
ojbis
Posté le 18-02-2005 à 16:47:42  profilanswer
 

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

n°986390
dsls
Posté le 18-02-2005 à 16:50:46  profilanswer
 

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

n°986397
ojbis
Posté le 18-02-2005 à 16:51:35  profilanswer
 

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
n°986409
sircam
I Like Trains
Posté le 18-02-2005 à 16:57:45  profilanswer
 

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


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°986414
ojbis
Posté le 18-02-2005 à 17:01:54  profilanswer
 

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
n°986434
glod 2
Votre trajet, notre projet.
Posté le 18-02-2005 à 17:14:49  profilanswer
 

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 :) )

n°986439
ojbis
Posté le 18-02-2005 à 17:17:12  profilanswer
 

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
n°986444
sircam
I Like Trains
Posté le 18-02-2005 à 17:20:41  profilanswer
 

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}
mood
Publicité
Posté le 18-02-2005 à 17:20:41  profilanswer
 

n°986450
ojbis
Posté le 18-02-2005 à 17:23:56  profilanswer
 

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
n°986460
the real m​oins moins
Posté le 18-02-2005 à 17:28:04  profilanswer
 

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


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°986464
ojbis
Posté le 18-02-2005 à 17:29:25  profilanswer
 

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

n°986467
the real m​oins moins
Posté le 18-02-2005 à 17:30:09  profilanswer
 

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 ?
n°986470
ojbis
Posté le 18-02-2005 à 17:31:41  profilanswer
 

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é

n°986480
the real m​oins moins
Posté le 18-02-2005 à 17:39:36  profilanswer
 

ojbis a écrit :

en parcourant la Javadoc


mon cul.


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°986494
djok_fb
C'était mieux avant!
Posté le 18-02-2005 à 17:50:58  profilanswer
 


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

n°986637
sircam
I Like Trains
Posté le 18-02-2005 à 22:15:23  profilanswer
 

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}
n°986639
sircam
I Like Trains
Posté le 18-02-2005 à 22:15:52  profilanswer
 

djok_fb a écrit :

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


My ass.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°986701
spiman
Posté le 18-02-2005 à 23:33:20  profilanswer
 

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.

n°986899
glod 2
Votre trajet, notre projet.
Posté le 19-02-2005 à 10:56:59  profilanswer
 

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 :)

n°987073
djok_fb
C'était mieux avant!
Posté le 19-02-2005 à 14:33:52  profilanswer
 

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 ;)

n°987078
glod 2
Votre trajet, notre projet.
Posté le 19-02-2005 à 14:45:39  profilanswer
 

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.

n°987079
the real m​oins moins
Posté le 19-02-2005 à 14:49:42  profilanswer
 

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

n°987165
sircam
I Like Trains
Posté le 19-02-2005 à 17:58:25  profilanswer
 

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}
n°987218
glod 2
Votre trajet, notre projet.
Posté le 19-02-2005 à 19:50:13  profilanswer
 

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
n°987798
ojbis
Posté le 20-02-2005 à 18:37:52  profilanswer
 

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
n°988200
djok_fb
C'était mieux avant!
Posté le 21-02-2005 à 11:56:07  profilanswer
 

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)

n°988214
lorill
Posté le 21-02-2005 à 12:07:40  profilanswer
 

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.

n°988286
glod 2
Votre trajet, notre projet.
Posté le 21-02-2005 à 13:00:05  profilanswer
 

Excellente explication :jap:

n°988428
ojbis
Posté le 21-02-2005 à 14:10:04  profilanswer
 

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 ?

n°988442
djok_fb
C'était mieux avant!
Posté le 21-02-2005 à 14:14:36  profilanswer
 

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
n°988511
ojbis
Posté le 21-02-2005 à 14:41:35  profilanswer
 

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
n°988984
djok_fb
C'était mieux avant!
Posté le 21-02-2005 à 19:25:36  profilanswer
 

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
n°989000
ojbis
Posté le 21-02-2005 à 19:36:16  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  [debutant] tableau java

 

Sujets relatifs
Java SWT[Brainstorming] Communication entre Programme C & Java
[debutant] commande INSERTCreer un tableau depuis une boucle
Je ne comprends pas comment faire (Debutant)[Html] Taille fixe de tableau
java & xml (parsers)[ASPX] Question de débutant
clent FTP en java[JAVA] (débutant) Copier un tableau à deux dimensions
Plus de sujets relatifs à : [debutant] tableau java


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR