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 :

[JDBC] récupération de clé auto-générée lors d'une insertion


Sujet :

JDBC Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 46
    Points : 38
    Points
    38
    Par défaut [JDBC] récupération de clé auto-générée lors d'une insertion
    Bijour tout le monde,

    J'ai un petit problème avec une BD Access.
    Je souhaite insérer un enregistrement dans une table, et récupérer la clé autogénérée qui découle de cette insertion.

    Je fais donc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    PreparedStatement preparedStatement = connection
              .prepareStatement("INSERT INTO table1 (champ1) VALUES (?)",Statement.RETURN_GENERATED_KEYS);
    preparedStatement.setString(1, "youpi");
    preparedStatement.executeUpdate();
    ResultSet resultSet = preparedStatement.getGeneratedKeys();
    Mais à l'exécution, j'obtiens (au niveau de la 1ere ligne) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UnsupportedOperationException
    Si je comprends bien, c'est pas possible de récupérer les clés autogénérées. Si?

    Et le cas échéant, comment je peux faire pour me sortir de cette impasse? Si je change de format de BD, ça sera possible?

    Merci d'avance.

  2. #2
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    88
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 88
    Points : 46
    Points
    46
    Par défaut
    Peut etre que ma solution n'est pas la meilleure, j'en conviens... mais je cherche toujours le moyen le plus simple et peut etre pas toujours le plus facile...

    A taplace, je ferais mon insertion et ensuite je récupèrerais la derniere valeur dans ma base du champs de la clé autogénérée... C'est très simple mais certes, bcp long a l'éxécution...

    Voila en espérant t'avoir un peu aider...

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 46
    Points : 38
    Points
    38
    Par défaut
    le problème, c'est que plusieurs personnes vont pouvoir travailler en même temps sur la BD, donc en cas d'insertion quasi-simultannée, ya moyen que ça merdouille....

  4. #4
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    88
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 88
    Points : 46
    Points
    46
    Par défaut
    Maintenant, je n'y connais pas gd chose la dedans malheureusement... mais ne serait il pas a cause de ton SGBD qui ne prendrait pas en compte cette focntionnalites... ou un truc dans le genre?
    Je suppose bien que des epxerts vont tres vite repondre a question et si pas n'hesite pas a mon avis a poster dans la rubrique base de données du forum, ou ils sont spécialisés dans la base de donéées...

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 220
    Points : 266
    Points
    266
    Par défaut
    Il y a de fortes chances que ce soit ca effectivement...

    Maintenant pour la recuperation, la methode consistant a recuperer la valeur par une deuxieme requete apres l'insertion fonctionne, a condition que les deux requetes, insertion et select soient consecutives.

    Bref, tu as besoin a ce niveau la que l'ensemble de tes requetes soient effectuées a partir du meme endroit, et que le bloc insertion + selection soit en synchronisé... De cette maniere, tu evites les acces concurents, qui te renverront des resultats faux...

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 46
    Points : 38
    Points
    38
    Par défaut
    Au niveau du SGBD, j'en sais fichtre rien, mais bon, c'est Access tout de même. Ils doivent bien avoir prévu le coup...

    Les requetes ne peuvent pas être effectuées depuis le même endroit, donc c'est râpé pour la soluce de l'INSERT puis SELECT dans un bloc synchro...

    Je viens de penser que j'ai essayé de remplacer RETURN_GENERATED_KEYS par NO_GENERATED_KEYS, mais ça marche pas mieux... troublant, n'est-ce pas ?

  7. #7
    NGY
    NGY est déconnecté
    Membre habitué
    Inscrit en
    Août 2002
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 137
    Points : 164
    Points
    164
    Par défaut
    Je suis d'accord avec ghorghor : faire un insert et juste derrière un select pour avoir la clé n'est pas la bonne méthode car rien ne garanti qu'entre temps personne n'a fait d'insertion.

    A mon avis, la bonne méthode (en tout cas c'est comme ça que je fais) :
    • 1- générer la clé unique (sequence.nextValue ou autre méthode) ;
      2- envoyer la requête d'insert avec la clé générée ;
    Comme ça, pas de problème.

  8. #8
    Membre régulier Avatar de Goldocrack
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    126
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 126
    Points : 112
    Points
    112
    Par défaut
    Bonjour, tu écris réellement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PreparedStatement preparedStatement = connection
              .prepareStatement("INSERT INTO table1 (champ1) VALUES (?)",Statement.RETURN_GENERATED_KEYS);
    Car il me semble que si tu veux vraiment mettre un point d'intérrogation en valeur il faut l'entourer de guillemets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PreparedStatement preparedStatement = connection
              .prepareStatement("INSERT INTO table1 (champ1) VALUES ('?')",Statement.RETURN_GENERATED_KEYS);
    Si la valeur n'est pas un ? mais une valeur texte ça doit marcher il me semble
    • Un langage de programmation est censé être une façon conventionnelle de donner des ordres à un ordinateur. Il n'est pas censé être obscur, bizarre et plein de pièges subtils (ça ce sont les attributs de la magie). [Dave Small]
    • Un programme c'est un sort que l'on jette à un ordinateur et qui se transforme en messages d'erreur.
    • Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse.


    et ne sont pas des options...

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 46
    Points : 38
    Points
    38
    Par défaut
    dans un PreparedStatement, tu mets des ? pour dire où se situent les paramètres, que tu remplaces ensuite grace à setString, setInt, ou autre...

    dans mon exemple, le ? de la requête va être remplacé par youpi.

  10. #10
    Membre expérimenté

    Homme Profil pro
    Senior Développeur JEE
    Inscrit en
    Avril 2002
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Senior Développeur JEE
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2002
    Messages : 795
    Points : 1 660
    Points
    1 660
    Par défaut
    La méthode la plus sécurisée pour retrouver la clé insérée est la méthode expliquée par NGY.

    Tu vas rechercher la prochaine séquence de ta clé, ensuite tu l'insères dans la table.

    Pour ce qui est dés PreparedStatement, l'ajout de quotes se fera automatiquement lorsque tu feras appel aux méthodes setString() ou setInt(),... comme l'a dit dj_lil.

    Voilà,
    Bonne chance
    Langages : Java, SQL
    Outils : Eclipse, Intellij
    SGBD : Oracle, PostgreSQL
    Mes Articles

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 46
    Points : 38
    Points
    38
    Par défaut
    Merci beaucoup à vous tous !

    Je vais faire comme NGY m'a conseillé.

    Une affaire rondement menée. Cool !

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 25
    Points : 23
    Points
    23
    Par défaut
    C'est toujours sympa de trouver une réponse à son problème sans avoir à la poser. Vive la recherche dans les forums

    Cependant, si qqn connait un driver odbc ou spécifique access libre de droit qui supporte le getGeneratedKeys ou une autre méthode de retour de valeur lors d'une insertion, je suis preneur...

    Sinon, il me reste à apprendre comment fonctionnent les séquences sur access., ça ne dervait pas être trop compliqué.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 25
    Points : 23
    Points
    23
    Par défaut
    hum, bon c'est pas si simple que ça... J'ai eu beau fouiller FAQs et tutorials, je n'ai trouvé aucune référence quant à l'existence de séquences sous Access. Il doit bien y avoir "quelque chose" derrière les auto-nums mais je n'ai pas trouvé de moyen d'y accéder.

    J'ai pu récupérer le noms des tables systèmes mais MSysAccessObject contient du blob, MSysAccessXML est vide pour ma db et toutes les autres table (MsysACEs, MSysObjects, MSysQueries, MSysRelationships) me font un no read permission lorsque je tente d'y accéder par JDBC et impossible de les voir dans le GUI de access. Bref, je suis un peu coincé et je ne vois pas d'autre solution que des work-around (soit relire la table après l'enregistrement soit essayer de gérer en java la création des id uniques...).

    Qqn a une idée? Un moyen de piloter les auto-nums depuis jdbc? ...

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 25
    Points : 23
    Points
    23
    Par défaut
    Apparement, c'est le driver standard qui est en cause dans le refus de retourner les clés générées. J'ai essayé avec un driver commercial T4 et ça marche... Par contre le driver commercial introduit un autre problème : 298$...

    Quelqu'un connait un driver JDBC gratuit ou bon marché pour MS Access qui n'a pas la susdite limitation?

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

Discussions similaires

  1. Récupération du Certificat du serveur lors d'une connexion TLS
    Par mixam85 dans le forum Bibliothèques
    Réponses: 0
    Dernier message: 13/06/2008, 10h43
  2. Récupération message d'erreur lors d'une insertion dans une BDD
    Par LoDev dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 22/12/2007, 19h11
  3. Récupérer le numéro auto lors d'une insertion
    Par zoidy dans le forum Access
    Réponses: 5
    Dernier message: 27/04/2006, 11h20
  4. [MySQL] Obtenir la valeur de l'auto-increment lors d'une insertion
    Par yazerty dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 08/01/2006, 15h18
  5. PB date lors d'une insertion en Base.
    Par NATHW dans le forum Langage SQL
    Réponses: 4
    Dernier message: 09/09/2004, 17h53

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