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 d'utilisation du ResultSet


Sujet :

JDBC Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 14
    Points : 14
    Points
    14
    Par défaut Problème d'utilisation du ResultSet
    Bonjour,

    j'ai une méthode qui prend en paramètre un resultset qui me renvoie bien deux lignes j'ai testé.Méthode ci-dessous :
    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
    public String indicatorDynamicAge(JTextField ageJTextField) {
     
            String constraint2 = "";
     
            if (!ageJTextField.equals(null)) {
     
                constraint2 = "AND birthday_Customer like '" + Integer.toString(year - Integer.parseInt(ageJTextField.getText())) + "%'";
     
            }
     
     
     
     
            return constraint2;
     
        }
     
     
     
     
        // calcul the different indicators 
     
        public void indicatorDynamic(ResultSet rs, JLabel label1, JLabel label2, JLabel label3, JLabel label4) {
     
            try {
     
                int nbrLoan = 0;
     
                Double average = 0.0;
     
                int loanDuration = 0;
     
                int avgDuration = 0;
     
                while (rs.next()) {
     
     
     
     
                    nbrLoan++;
     
                    System.out.println(nbrLoan);
     
                    average += rs.getInt("amount_Sim");
     
                    System.out.println(average);
     
                    loanDuration += rs.getInt("duration_Sim");
     
                }
     
                try {
     
                    avgDuration = (loanDuration / nbrLoan);
     
                } catch (ArithmeticException e) {
     
                    avgDuration = 0;
     
                }
     
     
     
     
                label1.setText("Nombre de prêt : " + nbrLoan);
     
                label2.setText("Montant total des prêts : " + average);
     
                label3.setText("Durée moyenne des prêts : " + avgDuration);
     
                label4.setText("Benefice total : " + "200 000 000");
     
            } catch (SQLException ex) {
     
                Logger.getLogger(ControllerScreenIndicator.class.getName()).log(Level.SEVERE, null, ex);
     
                System.out.println("fail sql");
     
            }
     
     
     
     
        }
    le problème c'est que ça ne modifie jamais les variables dans le while et je ne comprend pas pourquoi, étant donnée que j'ai bien un resultset non vide. Si quelqu'un pouvait m'aider je ne comprend pas du tout et j'ai essayé beaucoup de chose! Merci d'avance.

  2. #2
    Membre chevronné Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Points : 2 120
    Points
    2 120
    Par défaut
    salut,
    ou est ce que tu definis ton Resultset?
    et comment fais-tu ton appel?

    Eric

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 14
    Points : 14
    Points
    14
    Par défaut
    Bonjour,

    Tout d'abord merci de votre réponse :

    J'obtiens mon ResultSet via cette méthode :
    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
    public ResultSet getLoanIndicators(int idAgency, String constraint) {
     
            ResultSet rslt = null;
            try {
                String query = "SELECT first_Name_Customer,last_Name_Customer, percentage_Rate, monthly_Sim, duration_Sim,birthday_Customer, description_LoanRef, amount_Sim "
                        + "FROM LoanSimulation ls, Loan l, Customer c, Agency a,Consultant ct, LoanRef lr  "
                        + "WHERE l.id_Sim = ls.id_Sim "
                        + "AND c.id_Customer = ls.id_Customer "
                        + "AND ct.id_Consultant = ls.id_Consultant "
                        + "AND a.id_Agency = ct.id_Agency "
                        + "AND ls.id_LoanRef = lr.id_LoanRef "
                        + "AND a.id_Agency = ? ";
                if (!constraint.equals("")) {
                    query = query + constraint;
                }
                PreparedStatement queryPrep = conn.prepareStatement(query);
                queryPrep.setInt(1, idAgency);
                ResultSet rs = queryPrep.executeQuery();
                rslt= rs;
            } catch (SQLException ex) {
                Logger.getLogger(AccessDB.class.getName()).log(Level.SEVERE, null, ex);
     
            }
            return rslt;
        }

    Ensuite ma méthode est appelé ici :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     } else if (e.getSource() == submitButton) {
                //String constraint="";
                String constraint = setIndicatorDynamic(periodJDatePicker1.getDate(), periodJDatePicker2.getDate(), typeLoan, age);
                System.out.println(typeLoan);
                ResultSet rs = db.getLoanIndicators(idC0, "");
                this.indicatorDynamic(rs, label1, label2, label3, label4);
            }

  4. #4
    Membre chevronné Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Points : 2 120
    Points
    2 120
    Par défaut
    et qu´est ce que tu as comme resultat ou erreur?
    Eric

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 14
    Points : 14
    Points
    14
    Par défaut
    Merci de vos réponses, je n'ai aucune erreur, la méthode permet de modifier des labels et dans ce cas cela utilise les valeurs d'initialisations ça ne modifie jamais les valeurs de mes variables :/ je ne comprend pas même la valeur de ma variable nbrLoan qui s'incrémente de 1 ne change pas alors qu'en testant la requête en BDD cela me récupère bien des lignes, le while devrait donc normalement se jouer plusieurs fois

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    J'ai du mal à comprendre ce qui te pose soucis. Ton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                    System.out.println(nbrLoan);
    ne s'affiche jamais, comme si il n'y avait pas de résultat à ta requête?


    Aussi,, ça
    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
    public String indicatorDynamicAge(JTextField ageJTextField) {
     
            String constraint2 = "";
     
            if (!ageJTextField.equals(null)) {
     
                constraint2 = "AND birthday_Customer like '" + Integer.toString(year - Integer.parseInt(ageJTextField.getText())) + "%'";
     
            }
     
     
     
     
            return constraint2;
     
        }
    Ca mérite une triple paire de baffe en double aller-retour:
    • Tu ouvre la voie à de l'injection SQL alors qu'ailleurs tu utilise un preparedStatement
    • Tu manipule tes datas comme des Strings au lieu d'utiliser le format date de la DB.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 14
    Points : 14
    Points
    14
    Par défaut
    Mon problème c'est que je requête sur une bdd et en fonction des informations obtenu je modifie mes variables , par exemple ici je récupère des informations relatives à un prêt, je parcours ces informations avec mon while(rs.next()) et par exemple j'ai une variable amount_Sim qui représente le montant (capital emprunté au total) de tous les prêts. A chaque itération je prend la valeur du champs amount_Sim de la bdd et je l'ajoute à ma variable pour au final l'afficher sur une ihm via un label. Le problème étant ici que mes variables ne change jamais alors (elle reste à leur valeur initial ici zero) alors que je suis bien censé récupérer quelque chose avec mon resultSet (j'ai testé la requête en base). Je ne comprend donc pas pourquoi ces variables ne contiennent pas les valeurs que je cherche. Concernant le code permettant de prendre comme critère l'age d'un client je ne vois pas comment éviter l'injection Sql étant donnée que je récupère en base la date de naissance d'un client et que je lui soustrait la date actuel, comment pourrais-je faire pour éviter l'injection ? (je vais passer par des tranches d'ages finalement mais ça revient au même).

    Merci pour vos réponses et désolé pour les parties du code qui vous brûlent les yeux, je ne suis as super doué.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Ok, pour ton absence d'affichage, il peux y avoir de multiples causes:
    -> La requête que tu teste et celle de ton programme ne sont pas les mêmes
    -> Les paramètres ne sont pas les mêmes
    -> La base de données n'est pas la même
    -> Les JLabel que tu passe ne sont pas ceux de ton UI
    -> Tu as une Exception que tu noie quelque part

    La première chose à faire, c'est de mettre un breakpoint sur ta méthode qui exécute la requête et celle qui parcours les résultats, pour regarder si les variable ont les valeurs que tu veux et si la boucle est bien parcourue.


    Pour avoir la l'age à partir d'une date c'est une simple soustraction, la DB est tout à fait capable de réaliser ça ainsi que de manipuler des dates. Exemple en mysql

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    PreparedStatement stmt = connection.prepareStatement("select * from customer where TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE()) = ?");
    int ageRequis = ....;
    stmt.setInt(1,ageRequis);
    resultset = stmt.executeQuery();
    Si tu utilise un like sur une date, c'est que t'as stocké la date dans un varchar, et ça, c'est très mal.

  9. #9
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 352
    Points : 349
    Points
    349
    Par défaut
    Salut.
    J'ai mis en rouge mes observations.
    Citation Envoyé par hatlas Voir le message
    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
    public ResultSet getLoanIndicators(int idAgency, String constraint) {
    
            try {
                String query = "SELECT first_Name_Customer,last_Name_Customer, percentage_Rate, monthly_Sim, duration_Sim,birthday_Customer, description_LoanRef, amount_Sim "
                        + "FROM LoanSimulation ls, Loan l, Customer c, Agency a,Consultant ct, LoanRef lr  "
                        + "WHERE l.id_Sim = ls.id_Sim "
                        + "AND c.id_Customer = ls.id_Customer "
                        + "AND ct.id_Consultant = ls.id_Consultant "
                        + "AND a.id_Agency = ct.id_Agency "
                        + "AND ls.id_LoanRef = lr.id_LoanRef "
                        + "AND a.id_Agency = ? ";
                if (!constraint.equals("")) {
                    query = query + constraint;/*Quel est l'intérêt de faire cette concaténation?Alors que l'on voit bien que tu paramètres ta requête avec un seul paramètre.*/
                }
                PreparedStatement queryPrep = conn.prepareStatement(query);
                queryPrep.setInt(1, idAgency)
                ResultSet rs = queryPrep.executeQuery();
                rslt= rs;
            } catch (SQLException ex) {
                Logger.getLogger(AccessDB.class.getName()).log(Level.SEVERE, null, ex);
                
            }
            return rslt;
        }

    Ensuite ma méthode est appelé ici :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     } else if (e.getSource() == submitButton) {
                //String constraint="";
                String constraint = setIndicatorDynamic(periodJDatePicker1.getDate(), periodJDatePicker2.getDate(), typeLoan, age);
                System.out.println(typeLoan);
                ResultSet rs = db.getLoanIndicators(idC0, "");/*On voit bien que ton second paramètre est vide mais nulle part tu montre l'origine de la variable idC0. En réalité ta méthode ne prend en paramètre qu'un seul argument puisque le 2ème ne sert à rien en tout cas pas ici.Enfin,à part servir le test que tu peux d'ailleurs virer dans la méthode getLoanIndicators .*/
                this.indicatorDynamic(rs, label1, label2, label3, label4);
            }
    A ta place j'écrirai une seule méthode qui prendra en paramètre seulement l'idAgency dans le corps de laquelle j'effectue tout le traitement.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 14
    Points : 14
    Points
    14
    Par défaut
    Ok merci pour vos réponses, j'ai trouvé mon erreur je passais mal un paramètre à ma méthode ce qui faussait ma requête et dire que j'ai galéré comme un abrutis sans comprendre. l'idC0 était bien inutile (je me suis trompé dans le paramètre, ce n'était pas celui-ci). Merci kasko, Merci à vous ! pour la concaténation ça me sert à ajouter des contraintes si différents critères sont entré ou non.

  11. #11
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 352
    Points : 349
    Points
    349
    Par défaut
    Citation Envoyé par hatlas Voir le message
    pour la concaténation ça me sert à ajouter des contraintes si différents critères sont entré ou non.
    Salut.
    Lors de l'affectation de la valeur à tes paramètres tu affectes seulement pour l'idAgency mais jamais à constraint ce qui m'a d'ailleurs amené à dire que le 2ème paramètre est inutile voire dangereux puisque même si une contrainte est ajouté elle ne reçoit jamais de valeur(Autrement dit,elle est toujours nulle et ta requête serait un truc comme ça "AND a.id_Agency = ? null ";).
    ResultSet rs = db.getLoanIndicators(idC0, "/*Tu affectes une valeur vide histoire de rendre ton test vrai et donc empêcher la concaténation d'où ma suggestion de virer le test ainsi que le 2ème paramètre sauf si la méthode est appelé quelque part où ce paramètre est utilisé.*/")
    Bref,si ton problème est résolu n'oublie pas de passer la discussion en Résolue.

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

Discussions similaires

  1. Problème methode readline
    Par dark0502 dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 18/03/2009, 22h52
  2. Problème Method POST
    Par natie_49 dans le forum Web
    Réponses: 5
    Dernier message: 06/03/2007, 16h07
  3. [Servlet] Problème Methode init
    Par drixfkc dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 10/08/2006, 12h58
  4. Problème Methode POST
    Par nguthans dans le forum Langage
    Réponses: 3
    Dernier message: 13/01/2006, 20h28
  5. Problème methode POST
    Par raptor70 dans le forum Langage
    Réponses: 18
    Dernier message: 24/10/2005, 10h57

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