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

C# Discussion :

Datarow: comment récupérer la clé primaire généré par le SGBD ?


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2005
    Messages
    346
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 346
    Points : 119
    Points
    119
    Par défaut Datarow: comment récupérer la clé primaire généré par le SGBD ?
    Bonjour,

    Pour une insertion dans ma table, j'utilise d'abord la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maDataRow = maDataTable.NewRow()
    Ensuite, je remplis les champs de maDataRow avant de l'ajouter à la table et de mettre à jour la base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    maDataTable.AddRow(maDataRow)
    monTableAdapter.Update(maDataTable)
    J'aimerai ensuite connaitre la valeur de clé primaire donnée à ma ligne nouvellement ajoutée (colonne 'id' dans ma table). Cette colonne est bien reconnue comme clé primaire par VS, mais sa valeur de départ est toujours -1 (et s'autoincrémente vers -2, -3, etc.) et ne correspond jamais à la vraie valeur dans ma table, même après la méthode Update().

    Comment faire pour récupérer cette clé primaire ? Je dois l'utiliser pour l'insérer dans la ligne d'une autre table...
    Il doit bien y avoir un moyen de synchroniser l'état exact de ma ligne nouvellement ajoutée ?

    Bonne fin d'année

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Dans ta DataTable, la colonne "id" a bien la propriété AutoIncrement = True ?
    Quel est le SGBD que tu utilises ?
    Dans la base, les valeurs insérées sont-elles correctes ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2005
    Messages
    346
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 346
    Points : 119
    Points
    119
    Par défaut
    Dans ta DataTable, la colonne "id" a bien la propriété AutoIncrement = True ?
    Oui! La première fois (après l'exécution du programme), l'id d'une nouvelle ligne est -1, la suivante sera -2, -3, etc.
    Mais la clé réelle se ballade entre 1 et 2^63.

    Quel est le SGBD que tu utilises ?
    PostgreSQL.

    Dans la base, les valeurs insérées sont-elles correctes ?
    Mis à part l'id qui est généré par pgSQL, les valeurs des autres colonnes sont correctes...

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Bizarre...

    Tu utilises quoi comme provider ? Npgsql, ODBC, autre ? Je pense que Npgsql devrait savoir gérer ça correctement puisqu'il est fait spécifiquement pour PostgreSQL...

    Les commandes INSERT/UPDATE/DELETE du DataAdapter, tu les as écrites toi-même ? Si oui, essaie d'utiliser plutôt un CommandBuilder.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Août 2005
    Messages
    346
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 346
    Points : 119
    Points
    119
    Par défaut
    Tu utilises quoi comme provider ? Npgsql, ODBC, autre ? Je pense que Npgsql devrait savoir gérer ça correctement puisqu'il est fait spécifiquement pour PostgreSQL...
    J'utilise ODBC... je vais tester avec Npgsql. Merci du conseil.

    Les commandes INSERT/UPDATE/DELETE du DataAdapter, tu les as écrites toi-même ? Si oui, essaie d'utiliser plutôt un CommandBuilder.
    Je les ai écrite avec un CommandBuilder...

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Splug Voir le message
    J'utilise ODBC...
    Dans ce cas ça ne m'étonne pas que ça fonctionne pas : la façon de récupérer le dernier ID généré varie d'un SGBD à l'autre, et ODBC ne peut pas savoir comment le faire pour PostgreSQL en particulier...

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Août 2005
    Messages
    346
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 346
    Points : 119
    Points
    119
    Par défaut
    Dans ce cas ça ne m'étonne pas que ça fonctionne pas : la façon de récupérer le dernier ID généré varie d'un SGBD à l'autre, et ODBC ne peut pas savoir comment le faire pour PostgreSQL en particulier...
    Je comprends, cependant npgsql ne sait pas le faire non plus. Il semble que le mécanisme des séquences "serial" de postgresql ne soit pas simple à implémenter pour un pilote, même spécialisé...

    Cette page aborde le problème sur le forum de npgsql.
    Une solution est d'insérer la ligne, puis de faire appel à la fonction currval() de postgresql qui retourne la dernière valeur utilisée par la séquence, pour la session courante. C'est ce que je vais faire.

    Merci pour ces infos.
    Bonne année à tout le monde

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

Discussions similaires

  1. comment récupérer le flux xml généré par le ws
    Par didine6393 dans le forum Services Web
    Réponses: 1
    Dernier message: 25/10/2009, 19h15
  2. Comment recupérer le code SQL généré par Hibernate !
    Par nebisse dans le forum Hibernate
    Réponses: 14
    Dernier message: 21/08/2008, 23h56
  3. comment récupérer la clef primaire
    Par aedius dans le forum PhpMyObject
    Réponses: 2
    Dernier message: 16/01/2008, 23h30
  4. Comment cliquer sur des clips générés par actionscript
    Par ar vuzhugenn dans le forum ActionScript 1 & ActionScript 2
    Réponses: 4
    Dernier message: 04/01/2008, 11h02
  5. [XML] comment récupérer un arbre xml posté par http ?
    Par tomperso dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 02/07/2004, 10h29

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