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 :

Problème de ResultSet


Sujet :

JDBC Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Développeur Java
    Inscrit en
    Octobre 2011
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Octobre 2011
    Messages : 137
    Par défaut Problème de ResultSet
    Bonjour,

    J'aimerai récupérer les données contenues dans un ResulSet.
    J'ai créé une classe à cet effet (contrainte de mon développement)
    Le soucis, c'est par rapport au disconnect();
    Si je le fais avant de renvoyer le ResulSet, la variable qui contient sa valeur devient null (logique).
    Si je le fais après avoir envoyer le ResulSet, je ne peux accéder au disconnect();
    Mon collègue souhaite que le connect() et le disconnect() se fasse sur la classe Call.

    Le soucis est peut être de l'ordre d'un débutant, mais je ne trouve pas de solution. Vivement ce soir que je profite intégralement des mes 3 jours de week end pour me reposer

    Voici le code de la classe :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
        package com.cerpbn.extranet.traca.bdd;
     
     
        import java.sql.CallableStatement;
        import java.sql.ResultSet;
        import java.sql.SQLException;
     
        public class Call extends DatabaseAccessTraca{
     
            private String codeClient;
            private String dateDeb;
            private String dateFin;
            private String stmin;
            private String stmax;
            private String refulg;
            private String typacc;
            private CallableStatement cs;
            private String sql;
            private ResultSet resultat;
     
            public Call(String cclient, String refBac, String dateD, String dateF){
                codeClient = cclient;
                refulg = refBac;
                dateDeb = dateD;
                dateFin = dateF;
                stmin = "";
                stmax = "";
                refulg = refBac;
                typacc = "";
            }
     
            public ResultSet requeteHisto(){
                try{
                    connect();
                    System.out.println("Code client : " + codeClient);
                    System.out.println("RefBac : " + refulg);
                    System.out.println("avant le call : ok");
                    sql = "CALL UB0222P(?,?,?,?,?,?,?)";
                    cs = con.prepareCall(sql); //Construction du Call
                    System.out.println("après le preparecall : ok");
     
                    stmin = "00"; //Statut Minimum  (de 00 à 99)
                    stmax = "99"; //Statut Maximum  (de 00 à 99)
                    //Les statuts permettents de délimiter les critères de sélection au niveau du bac par rapport à ses références
     
                    typacc = "3"; //Type d'accès :
                    //Valeurs du type d'accès (A SAISIR OBLIGATOIREMENT):
                    //1 => Client destinataire
                    //2 => Client expediteur
                    //3 => Cycle ULG (pour l'historique du bac)
     
     
                    //On remplit les paramètres du Call par les paramètres rentrés ci-dessus
                    cs.setString(1,codeClient);
                    cs.setString(2,dateDeb);
                    cs.setString(3,dateFin);
                    cs.setString(4,stmin);
                    cs.setString(5,stmax);
                    cs.setString(6,refulg);
                    cs.setString(7,typacc);
                    System.out.println("avant le call execute : ok");
     
                    if(cs.execute()){
                        return resultat = cs.getResultSet();
                    }
     
                    disconnect();
                }
                catch(Exception e) {
                    while (e != null)
                    {
                        System.out.println("Message: " + e.getMessage());
                        System.out.println("SQLState: " + ((SQLException) e).getSQLState());
                        System.out.println("ErrorCode: " + ((SQLException) e).getErrorCode());
                        e = ((SQLException) e).getNextException();
                    }
                }
     
     
                return resultat;
     
            }
     
     
     
     
        }
    Je l'appelle avec ce bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Call call = new Call(cclient, refBac,"","2011-11-09");
     
     
                    ResultSet resultat = call.requeteHisto(); //On récupère le résultat du Call
     
     
                    while(resultat.next()){

  2. #2
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 713
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 713
    Par défaut
    Tel que c'est fait, on ne peut pas avoir un disconnect dans le Call
    sinon on n'accède plus aux données.

    JDBC prévoit un type de resultset déconnecté (je ne me souviens pas du nom exact de la classe) mais il n'est pas supporté par tous les drivers.

    Par contre, comme ta méthode call.requeteHisto() renvoie toujours le même resultset contenant les mêmes colonnes,
    pourquoi ne pas lui faire tout simplement renvoyer un ArrayList contenant les données au lieu du resultset ?

    Il suffit d'inclure ta boucle while dans la méthode call.requeteHisto() et de remplir l'ArrayList dans ta méthode
    une fois que ton ArrayList est rempli, tu peux tranquillement fermer ta connexion
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  3. #3
    Membre très actif
    Profil pro
    Développeur Java
    Inscrit en
    Octobre 2011
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Octobre 2011
    Messages : 137
    Par défaut
    Oui bien entendu.
    Mais je ne voulais pas surcharger ma classe Call avec un code que j'effectue sur une autre classe.

    Mais il est vrai que je n'ai hélas pas d'autres moyens d'arriver à mes fins.

    Je te remercie de m'avoir aidé et te souhaite une bonne journée

    Edit : je n'ai pas vu le message précédent, donc je retire résolu en attendant hihi

  4. #4
    Membre très actif
    Profil pro
    Développeur Java
    Inscrit en
    Octobre 2011
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Octobre 2011
    Messages : 137
    Par défaut
    Après avoir lu le message précédent :

    Je ne peux hélas pas mettre un disconnect dans ma classe principale puisque mon collègue souhaite le placer dans la même classe où se trouve le connect()

    La solution la plus envisageable est de place mon while resultat.next() dans la classe Call à la suite de mon cs.execute()

    Merci encore

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    ben oui c'est le plus logique. Si Call est un DAO, ce n'est pas un resultset qu'il doit retourner, mais des objets contenant les données qu'il crée.

    Bien-sûr, ceci n'est applicable que pour les petits resultSet. Pour les grand sets de données (plusieurs 10aine de M) , il n'y a pas le choix, il faut reporter la déconnexion à plus tard

  6. #6
    Membre très actif
    Profil pro
    Développeur Java
    Inscrit en
    Octobre 2011
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Octobre 2011
    Messages : 137
    Par défaut
    Merci, je prends note

  7. #7
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    retirez ce disconnect de "requeteHisto" et faite le plus loin.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Call call = new Call(cclient, refBac,"","2011-11-09");
    try{
                    ResultSet resultat = call.requeteHisto(); //On récupère le résultat du Call
     
     
                    while(resultat.next()){
                         ......
                    }
    }finally {
        call.disconnect();
    }

    PS: toujours faire vos nettoyage (DB, stream, etc) dans des blocs finally garantis d'être exécutés.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec ResultSet
    Par rabDev dans le forum Général Java
    Réponses: 6
    Dernier message: 15/11/2013, 17h02
  2. [Hibernate2] Problème avec ResultSet
    Par rela33 dans le forum Hibernate
    Réponses: 11
    Dernier message: 17/01/2012, 13h50
  3. Problème :ResultSet dans 1 JTable swing
    Par jer190 dans le forum JDBC
    Réponses: 3
    Dernier message: 18/07/2008, 13h42
  4. bdd java problème avec ResultSet
    Par moon96 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 28/04/2008, 23h06
  5. [ResultSet] problème sur updateRow
    Par in dans le forum JDBC
    Réponses: 4
    Dernier message: 15/06/2006, 15h46

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