Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4
  1. #1
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2009
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : avril 2009
    Messages : 521
    Points : 492
    Points
    492

    Par défaut [PostgreSQL] Utiliser generatedKeys

    Bonjour,

    je suis en train de migrer ma base de données et après plusieurs recherches et essais de mon coté, je m'en remet à vous.
    Comme dit dans le titre, je passe à PostgreSQL et je souhaite récupérer les clés générées sur une requêtes INSERT.

    Voici le code "basique" que j'utilisais avec MySQL

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    String requete = "INSERT INTO GroupeTest (titre, scenario) VALUES (?, ?)";
                PreparedStatement pstmt = getConnexion().prepareStatement(requete,
                       Statement.RETURN_GENERATED_KEYS);
                pstmt.setString(1, groupeTest.getTitre());
                pstmt.setInt(2, Integer.parseInt(contenantId.substring(1)));
                pstmt.executeUpdate();
                ResultSet generatedKeys = pstmt.getGeneratedKeys();
                if (generatedKeys.first()) {
                    groupeTest.setId(generatedKeys.getInt(1));
                }
    Le plantage se fait au niveau du generatedKeys.first() où PostgreSQL me renvoie L'opération nécessite un scrollable ResultSet, mais ce ResultSet est FORWARD_ONLY. J'ai alors tenté de remplacé
    Code :
    Statement.RETURN_GENERATED_KEYS
    par
    Code :
    ResultSet.TYPE_SCROLL_INSENSITIVE
    et par
    Code :
    ResultSet.TYPE_SCROLL_SENSITIVE
    . J'obtiens la même erreur. J'en déduis alors que le résultSet extrait du preparedStatement n'est pas Scrollable.

    Comment faire ?
    Peut-on configurer PostgresSQL pour rendre le comportement similaire à MySQL sachant que je parcours la ResultSet de façon séquentielle ?

    Merci d'avance

  2. #2
    Expert Confirmé
    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    octobre 2005
    Messages
    1 687
    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 : 1 687
    Points : 2 941
    Points
    2 941

    Par défaut

    Code :
    if (generatedKeys.first()) {
    à la place de .first()
    as-tu essayé .next() ?

    en général, les ResultSet sont positionnés avant le 1er enregistrement lors de l'ouverture
    ·· −· −−· ·· ·−· ··− −− ·· −− ··− ··· −· −−− −·−· − ·
    · − −·−· −−− −· ··· ··− −− ·· −− ··− ·−· ·· −−· −· ··
    D'abord qu'il marche. Ensuite qu'il soit rapide. Enfin qu'il soit agréable à utiliser.
    First, make it work. Then, make it fast. Finally, make it user-friendly.
    Erst, mach', dass es funktioniert. Dann, mach', dass es schnell geht, Zum Schluss mach' es benutzerfreundlich.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2009
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : avril 2009
    Messages : 521
    Points : 492
    Points
    492

    Par défaut

    Citation Envoyé par Népomucène Voir le message
    Code :
    if (generatedKeys.first()) {
    à la place de .first()
    as-tu essayé .next() ?

    en général, les ResultSet sont positionnés avant le 1er enregistrement lors de l'ouverture
    En effet, je n'ai pas d'exception levée. Pour le coup, puisque comme tu le dis, les ResultSet sont positionnés avant le 1er enregistrement lors de l'ouverture, res.firs() et res.next() est censé revenir au même.
    La différence est le fait que ça une ligne relative et non une absolue.

  4. #4
    Expert Confirmé
    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    octobre 2005
    Messages
    1 687
    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 : 1 687
    Points : 2 941
    Points
    2 941

    Par défaut

    La différence est le fait que ça une ligne relative et non une absolue.
    .first() ne marche que sur des ResultSet scrollables
    par exemple si le pointeur est sur le 5ème enregistrement et que tu as besoin de revenir sur le 1er
    ·· −· −−· ·· ·−· ··− −− ·· −− ··− ··· −· −−− −·−· − ·
    · − −·−· −−− −· ··· ··− −− ·· −− ··− ·−· ·· −−· −· ··
    D'abord qu'il marche. Ensuite qu'il soit rapide. Enfin qu'il soit agréable à utiliser.
    First, make it work. Then, make it fast. Finally, make it user-friendly.
    Erst, mach', dass es funktioniert. Dann, mach', dass es schnell geht, Zum Schluss mach' es benutzerfreundlich.

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •