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 :

Récupération ID autoincrement


Sujet :

JDBC Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de touftouf57
    Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Par défaut Récupération ID autoincrement
    bonjour,

    je cherche depuis 2heures ce qui ne va pas dans mon code. J'ai bien trouvé un post pour le même problème. J'ai fais la même chose, adapté à mon cas, et cela ne veux pas fonctionner!
    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 {
    				PreparedStatement pst = this.connection
    						.prepareStatement("Insert Into MARQUE (Marque) Values(?)");
    				pst.setString(1, marque.getMarque());
    				pst.execute();
     
    				ResultSet cleGenere=pst.getGeneratedKeys();
    				while (cleGenere.next())
    						marque.setIdMarque(cleGenere.getInt(1));
    				cleGenere.close();
    				log.log(Level.INFO,"marque ajouté:" + marque.toString());
    				pst.close();
    			} catch (SQLException e) {
    				// TODO Auto-generated catch block
    				System.out.println(e.getSQLState() + " " + e.getErrorCode());
    				e.printStackTrace();
    			}
    			}
    L'ajout à la base se fait bien mais lorsque je passe l'instruction getGeneratedKeys() je recois l'erreur "opération interdite" !!
    J'ai cru que c'était le ResultSetType qui n'était pas bon, mais apparement ce n'est pas de là que vient le problème.
    pourtant GetGeneratedKeys() se fait bien sur un statement et renvoi un ResultSet?

    J'ai même cru qu'il fallait importé PreparedStatement autre que java.sql.preparedStatement, mais il n'y en a pas d'autre
    merci d'avance.

  2. #2
    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
    tu peux nous donner le stacktrace que tu obtiens, quel driver tu utilise et le shéma de ta table ainsi que ses éventuels triggers / colonnes automatiques?

  3. #3
    Membre éclairé Avatar de touftouf57
    Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Par défaut
    Bonjour,
    voici le schéma de la table:

    /*-----------------------------------------MARQUE---------------------------------------------*/
    /*==============================================================*/
    /* Table : MARQUE */
    /*==============================================================*/
    create table MARQUE (
    IDMARQUE NUMBER(6) not null,
    MARQUE VARCHAR2(15),
    constraint PK_MARQUE primary key (IDMARQUE)
    )
    /

    ainsi que le trigger
    create trigger TIB_MARQUE before insert
    on MARQUE for each row
    declare
    integrity_error exception;
    errno integer;
    errmsg char(200);
    dummy integer;
    found boolean;

    begin
    -- La colonne "IDMARQUE" utilise la sequence S_MARQUE
    select S_MARQUE.NEXTVAL INTO :new.IDMARQUE from dual;

    -- Traitement d'erreurs
    exception
    when integrity_error then
    raise_application_error(errno, errmsg);
    end;
    /


    Et le stacktrace avec
    getSQLState=99999 et getErrorCode=17090 mais je ne trouve pas cette erreur sur le site d'oracle (on passe de 16992 à 17500). L'error code provient-il réellement d'oracle?

    java.sql.SQLException: opération interdite
    at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)
    at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:133)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:199)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:263)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:271)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:445)
    at oracle.jdbc.driver.OracleStatement.getGeneratedKeys(OracleStatement.java:4756)
    at oracle.jdbc.driver.OracleStatementWrapper.getGeneratedKeys(OracleStatementWrapper.java:347)
    at baseDeDonnees.BaseDeDonnees.ajouteMarque(BaseDeDonnees.java:723)
    at baseDeDonnees.test.testInsertion(test.java:126)
    at baseDeDonnees.test.main(test.java:40)



    Autre question. Est-il possible sous oracle d'éviter les doublons sur un champs différent de la clé primaire? Car comme est faite la table actuellement je peux ajouter 40 fois la même marque sans que cela pose de problème.
    Si c'est pas possible, je ferais une méthode equals pour savoir si c'est la même marque.

    Merci de votre aide.

  4. #4
    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
    pour les doublons, suffit de mettre la colonne avec une contrainte unique.

    Pour le generatedkeys, je pense que, malheureusement, ca ne marche pas avec les trigger. Les triggers pouvant faire plein de choses, dur de dire, je pense, qu'est-ce qui est autogénéré dedans

    par contre, il me semble que ce genre de requete devrais marcher (en retirant le trigger):


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    PreparedStatement pst = this.connection
    						.prepareStatement("Insert Into MARQUE (IDMarque,Marque) Values(S_MARQUE.NEXTVAL,?)");
    				pst.setString(1, marque.getMarque());
    				pst.execute();
     
    				ResultSet cleGenere=pst.getGeneratedKeys();

  5. #5
    Membre éclairé Avatar de touftouf57
    Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Par défaut
    Merci pour le "unique", je me demande comment j'ai pu passé à coté?? la fatigue peu-t-être.

    Bref j'ai désactivé le trigger et modifié mon code en:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    PreparedStatement pst = connection.prepareStatement("Insert Into MARQUE (IDMarque,Marque) Values(S_MARQUE.NEXTVAL,?)");
    				pst.setString(1, marque.getMarque());
    				pst.execute();
    				ResultSet cleGenere=pst.getGeneratedKeys();
    				while (cleGenere.next())
    						marque.setIdMarque(cleGenere.getInt(1));
    mais c'est toujours la même chose. L'insertion s'effectue correctement mais pas moyen de récupérer les clés générées.

    Une autre piste?
    Merci

  6. #6
    Membre éclairé Avatar de touftouf57
    Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Par défaut
    J'ai oublié de préciser que la base que j'attaque est une base Oracle 11g et que j'utilise le driver "oracle.jdbc.driver.OracleDriver"

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

Discussions similaires

  1. Récupération valeur d'une propriété type TStrings
    Par Stéphane Vaillant dans le forum Langage
    Réponses: 2
    Dernier message: 01/03/2003, 11h47
  2. [XMLRAD] récupération de donnée
    Par Mitch79 dans le forum XMLRAD
    Réponses: 7
    Dernier message: 30/01/2003, 15h36
  3. Réponses: 5
    Dernier message: 09/01/2003, 11h55
  4. récupération d'images
    Par MANU_2 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 05/08/2002, 18h36
  5. Réponses: 4
    Dernier message: 05/06/2002, 12h15

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