IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JDBC Java Discussion :

trier un resultset


Sujet :

JDBC Java

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 25
    Points : 17
    Points
    17
    Par défaut trier un resultset
    bonjour,

    j'ai 40 colonnes dont les données de certaines peuvent être toutes non renseignées et restées à null puisqu'autorisé par défaut.
    je veux trier mon resultset pour qu'il me renvoi que les noms des colonnes ou au moins un champ (row) est rempli.

    le pb, c'est que sur certaine table je ne retrouve pas toutes mes colonnes ou il y a au moins un champ enregistré et ds d'autres j'ai le message d'erreur suivant :

    After end of result set

    je précise que je suis débutant et que l'erreur provient tres certainement de mon code que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    rs.first();
    	do
    	{
    		if (rs.getString(j) != null )
    		{
                    colonnes.add(rs.getMetaData().getColumnName(j));			
    		rs.next();
    		}
    		else
    		{
    			j++;
    		}
    		j++;
    	}while (j < rs.getMetaData().getColumnCount()+1);
    merci d'avance de prendre le temps de me répondre si quelqu'un a un idée...

  2. #2
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 14
    Points : 14
    Points
    14
    Par défaut
    Quand tu fais
    tu passes à l'enregistrement suivant de ton recordset résultat, or dans ta boucle, ta condition repose sur le nombre de colonnes sélectionnées par ton recordset ("while (j < rs.getMetaData().getColumnCount()+1);") et non le nombre d'enregistrement.
    De ce fait, tu peux te retrouver avec le problème suivant :
    - Recordset de 10 enregistrement (lignes)
    - 40 colonnes sélectionnées
    -> Dépassement lors du parcours du lot de réponse ("After end of result set")

    Contrôle donc le nombre d'enregistrements lus en appelant "next" et en testant son retour (si à false, alors tu es arrivé à la fin de tes enregistrements)

  3. #3
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    merci Pecky,

    j'ai fait ce test en espérant avoir bien compris ce que tu me demandais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int compteur = 0;
    while (rs.next())
    {
    	compteur++;
    	System.out.println("nombre d'enregistrements : " +compteur);		
    }
    J'ai que 6 enregistrements donc 6 rows comme ds la bdd... et avec ma boucle je ne récupére effectivement que le nom de 3 colonnes sur 10 ou il y a au moins un champ de renseigné!!

    peux tu me mettre sur la voie afin d'écrire correctement cette boucle ?
    j'essaye également de mon coté en tout cas.

    encore merci de m'avoir bien décrit mes erreurs ;-)

  4. #4
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 14
    Points : 14
    Points
    14
    Par défaut
    J'utilise une hashtable, afin de ne pas enregistrer 2 fois la colonne.
    (je ne sais pas quel jdk tu utilises, dans la version 1.5 on peut typer les hashtable (et autres) avec -> <int,String>)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    /** Hashtable pour ne pas stocker 2 fois la colonne (non vide) */
    Hashtable <int,String> colonnes = new Hashtable<int,String>();
    /** Parcours du resultSet
    while (rs.next())
    {
            /** Parcours des colonnes de l'enregistrement */
    	do
    	{
    		/** Valeur non nulle -> On stocke le nom de la colonne, si elle n'est pas encore dans la hashtable */
    		if ((rs.getString(j) != null ) && (!colonnes.containsKey(j)))
    		{
                    colonnes.put(j,rs.getMetaData().getColumnName(j));			
    		}
    		j++;
    	}while (j < rs.getMetaData().getColumnCount()+1);
    }
    J'espère être clair, bon courage

  5. #5
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    merci du coup d'main mais je galere toujours...

    en fait je recupere mes noms de colonnes ds un Vector colonnes et les données ds un Vector data, ce qui revient a peu pres au même que le hashTable si ce n'est pour la verif d'un nom de colonne déja existant.

    sinon j'ai également ce message :

    Column Index out of range, 41 > 40

    je crois que c'est quand le " while (rs.next()) " qui arrive au bout de l'enregistrement ou qui le dépasse peut etre même, bref !!

    je continue de chercher

  6. #6
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 14
    Points : 14
    Points
    14
    Par défaut
    A mon avis c'est ton compteur "j" qui n'est pas remis à 1 (1ere colonne) lorsque tu passes à l'enregistrement suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    while (rs.next())
    {
    	/** Parcours des colonnes de l'enregistrement */
            j = 1;
    	while (j <= rs.getMetaData().getColumnCount())
    	{
    		/** Valeur non nulle -> On stocke le nom de la colonne, si elle n'est pas encore dans la hashtable */
    		if ((rs.getString(j) != null ) && (!colonnes.containsKey(j)))
    		{
                    colonnes.put(j,rs.getMetaData().getColumnName(j));			
    		}
    		j++;
    	}
    }

  7. #7
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    apparemment cela fonctionne, me reste plus qu'a éviter les doublons et également à recupérer les données...

    j'ai encore du travail la dessus.

    encore merci a toi pecky, ca m'a permis d'avancer et surtout de mieux comprendre comment tout cela fonctionnne.

Discussions similaires

  1. [ STRUTS ][ JSP ][ ArrayList] un lien pour trier
    Par LoulouFifi dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 03/02/2004, 17h24
  2. Trier aléatoirement un résultat de requête
    Par ang36 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 08/01/2004, 17h38
  3. trier les données dans le cache ??
    Par psyco2604 dans le forum XSL/XSLT/XPATH
    Réponses: 31
    Dernier message: 10/06/2003, 10h03
  4. Créer une vue pour trier une requete UNION ?
    Par Etienne Bar dans le forum SQL
    Réponses: 3
    Dernier message: 03/01/2003, 20h22
  5. trier un tableau et compter des elements du tableau
    Par remi51 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 17/06/2002, 16h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo