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 :

État de curseur non valide


Sujet :

JDBC Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 22
    Par défaut État de curseur non valide
    Bonjour,

    Pour remplir une jCombo avec une requête SQL j'ai l'erreur "Etat de curseur non valide".

    J'ai essayé isLast(), isAfterLast() sans succès.

    Quelle est ma bêtise ?
    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
     
     
            try {
                cnxPays = DriverManager.getConnection("jdbc:odbc:Contacts");
            } catch (SQLException e) {
                System.out.println("Connection à la base de données impossible : " + e);
            }
     
            qryPays = "SELECT DISTINCT Pays FROM Contact GROUP BY Pays";
            try {
                Statement smtPays = cnxPays.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
                rstPays = smtPays.executeQuery(qryPays);
                while (!rstPays.isLast() && !rstPays.isAfterLast() && rstPays.next()) {
                    cmbPaysContact.addItem(rstPays.getString("Pays"));
                }
                rstPays.close();
            } catch (SQLException e) {
                txtStatus.setText("Anomalie sur la requête SELECT Pays FROM Contact : " + e);
            }

  2. #2
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    bonjour,

    Es tu obligé de te connecté en ODBC ? A quel base tu te connecte ?

    Effectivement "!rstPays.isLast() && !rstPays.isAfterLast()" ne sert a rien car si tu es sur le dernier enreg le next retourne false et ta boucle s'arrète.

    A tous hasard, essai de faire "rstPays.getString(1)" au lieu de rstPays.getString("Pays")
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 22
    Par défaut
    Bonjour Alkan,

    Je suis sur une base Access 2007 (.accdb).

    J'ai déjà essayé tout un tas de choses, notamment en récupérant la colonne par son numéro plutôt que par son nom.

    En fait voilà ce que j'ai constaté :

    J'ai une table où il y a 381 contacts. Pour chaque contact j'ai un champs "Pays" et le nombre de pays distincts est de 45.

    Lorsque je fais mon SELECT DISTINCT avec ou sans GROUP BY, tout se passe bien jusqu'à la 45ème ligne. Avec ces 45 pays je remplis une jCombo.

    A partir du 46ème, je suis en erreur sur la colonne Pays. Et dans mon resultset j'ai 381 enregistrements ! Alors que je pensais ne récupérer que 45 lignes.

    Quelque-chose m'échappe.

  4. #4
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    bonjour,

    Le problème semble venir de Access lui même. Si tu peux changer de base de données, il existe de très bonne base de données embarqué en java.
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre émérite Avatar de fraco
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2006
    Messages : 750
    Par défaut
    Salut tous !

    J'ai eu le même problème; c'est comme si la requête retournait 381 lignes dont seules les 45 premières sont valides...
    Finalement j'ai décidé carrément d'ignorer l'erreur (c'est pas beau, hein ?).

    cri unanime : "Si tu peux changer de base de données...." faut pas hésiter.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 22
    Par défaut
    Merci pour vos réponses.

    Je vais ignorer l'erreur (même si je n'aime pas trop faire ça !) et envisager de changer de gestionnaire de base de données.

    Oui, mais lequel ? un qui soit fiable et pour qui il existe un outil de conversion avec Access 2007 ?

  7. #7
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    pour ce qui est de la base de données je te conseille H2 par contre pour la migration il faudra probablement le faire toi même, mais c'est pas trop compliqué.
    Tu peux le faire facilement avec un petit programme Java
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Ce n'est pas un problème de base de données mais d'utilisation.
    Dans tous cas, ce n'est pas la bonne méthode de tester isLast() isFirst sur la boucle qui serait évalué à chaque itération...
    En plus, il faut un statement bien particulier pour faire du isLast()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
    Tu peux faire un truc comme ceci
    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
     
    boolean first = true;
    while (rs.next())
    {
       ...
       if (first)
       {
          ...
          first = false;
       }
       ...
    }
     
    if (!first)
    {
       ... ici, on a traité au moins une donnée et on est à la fin...
    }
    Enfin, un truc dans le genre, il y a d'autre moyen de faire bien sûr... mais cette méthode ne coûte pas cher en accès DB supplémentaires

    Autre point, ça n'a aucun intérêt de faire un group by lorsque tu fais un select distinct...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    bonjour OButterlin,

    Ca fait plusieurs années que je travail avec divers bases de données et c'est la première fois que je vois ca.
    J'imagine que c'est spécifique a Access que je n'utilise pas bien sur .
    Pourrais tu etre plus explicite sur ce traitement ? les raisons qui nécessite l'utilisation de ce boolean ?

    Merci d'avance, c'est pour ma culture générale
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Et bien, pour commencer, tu peux essayer de faire la boucle suivante avec une base MySQL (par exemple) et tu verras que le problème est le même...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    
    while (!rstPays.isLast() && !rstPays.isAfterLast() && rstPays.next()) 
    {
       ...
    }
    (pour une fois que ce n'est pas la faute d'access )

    Pour le boolean, c'est relativement simple... ça évite d'avoir à utiliser la DB pour savoir si on est sur le premier enregistrement lu ou le dernier... à l'ancienne quoi...

    Le fait de tester isLast() et isFirst() laissant supposer qu'on se préoccupe de savoir si on traite le premier ou le dernier... et je suppose qu'il veut faire un traitement particulier dans ces 2 cas spéciaux bien sûr...

    Initialement, first est true, donc, au premier enregistrement lu (dans la boucle while), on fait le traitement spécifique du premier et on positionne first à false (ce qui fait que pour tous les autres enregistrements, on ne passera plus par ce if)
    à la fin de la boucle while, on a le cas particulier du dernier enregistrement (si on avait au moins un enregistrement puisque le ResultSet pourrait être "vide")
    Si first est false, c'est qu'on est entré dans la boucle while, et hop, c'est ok... on est sûr d'avoir lu au moins un enregistrement...
    (beaucoup de blabla pour expliquer le code qui me semblait assez clair )

    Il y a quelque chose qui te choque ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    Oui en effet, je comprend ce que tu fais avec ton boolean.

    Si j'ai bien compris le problème de départ (peut être que je suis dans l'erreur) c'est le code suivant qui pose problème.
    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
     
     try {
                cnxPays = DriverManager.getConnection("jdbc:odbc:Contacts");
            } catch (SQLException e) {
                System.out.println("Connection à la base de données impossible : " + e);
            }
     
            qryPays = "SELECT DISTINCT Pays FROM Contact GROUP BY Pays";
            try {
                Statement smtPays = cnxPays.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
                rstPays = smtPays.executeQuery(qryPays);
                while (rstPays.next()) {
                    cmbPaysContact.addItem(rstPays.getString("Pays"));
                }
                rstPays.close();
            } catch (SQLException e) {
                txtStatus.setText("Anomalie sur la requête SELECT Pays FROM Contact : " + e);
            }
    Ne comprenant pas pourquoi il avait l'erreur il a alors tenté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while (!rstPays.isLast() && !rstPays.isAfterLast() &&rstPays.next()) {
                    cmbPaysContact.addItem(rstPays.getString("Pays"));
    }
    C'est pour cela que je me suis étonné de la solution que tu proposais
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 22
    Par défaut
    Oui Alkhan, c'est exactement ça.

    Lorsque je fais mes next, isLast() n'est vérifié qu'au 381ème enregistrement.

    Lorsque j'utilise ma colonne ("Pays"), il ne la trouve pas à partir du 46ème enregistrement et me donne une erreur.

    Et effectivement, DISTINCT et GROUP BY sont redondants mais bon, quand je teste, j'essaie de tout tester ! (surtout quand ça plante lamentablement) :-D

  13. #13
    Membre émérite Avatar de fraco
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2006
    Messages : 750
    Par défaut
    Chez moi ça plante avec un simple while (result.next())....
    (alors que d'autres bases de données n'ont pas ce problème)
    je suis obligé d'intervenir avec une variable stop :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        boolean stop = false;
        while (result.next() && (!stop)) {
               try {
                      obj = result.getObject(1);
                      ........
                } catch (Exception ex) {
                       ex.printStackTrace();
                       stop = true;
                }
        }
    ...ainsi on s'arrête au 46 ème enregistrement.
    qu'en pensez-vous ? (c'est de la bidouille)
    merci pour votre avis

  14. #14
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    Bonjour,

    En effet le problème le laisse perplexe, je pense que le problème viens d'access et c'est pourquoi j'avais conseillé de partir sur une base H2.
    Access et java c'est pas le grand amour

    En effet fraco c'est une bidouille qui marche mais, je pense qu'en restant sur Access Titounet007 risquerait de se retrouver avec d'autres problèmes (mais la c'est juste une supposition, et ca n'engage que moi).
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. [JDBC-ODBC] Etat de curseur non valide
    Par I o dans le forum JDBC
    Réponses: 7
    Dernier message: 04/05/2015, 12h22
  2. État de curseur non valide
    Par gabay dans le forum JDBC
    Réponses: 1
    Dernier message: 05/05/2009, 17h59
  3. Réponses: 1
    Dernier message: 19/04/2007, 11h44
  4. [JDBC] état de curseur non valide ?
    Par Hydre dans le forum JDBC
    Réponses: 9
    Dernier message: 03/10/2005, 14h03
  5. [JSP] Erreur Etat de curseur non valide
    Par logica dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 03/05/2005, 14h42

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