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

ADO.NET Discussion :

Gestion d'une clé autoincrementée


Sujet :

ADO.NET

  1. #1
    Membre actif Avatar de Masmeta
    Homme Profil pro
    Ing. R&D informatique industrielle
    Inscrit en
    Mai 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Ing. R&D informatique industrielle
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 472
    Points : 221
    Points
    221
    Par défaut Gestion d'une clé autoincrementée
    Bonjour,

    Je suis sous VS 2010 avec une base sql server
    j'ai une table qui a une clé primaire autoincremente non nulle.
    Elle est relié par un dataset/ table adapter.

    le schéma de ma table est le suivant : id Nom idparent avec idparent = id de la même table

    Comment puis je gérer facilement l'id lorsque j'ai plusieurs insertion avec des relations idparent = id dans les lignes à insérer?

    En espérant être compréhensible.
    Cordialement.
    "Nulla Tenaci Invia Est Via"
    Aux persévérants aucune route n'est interdite

  2. #2
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut
    Tu es obligé d'avoir le champ idparent défini comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    create table matable
    (
    id int not null primary key identity,
    idparent int null references matable(id)
    ..
    ..
    ..
    )
    go
    Dès lors, tes inserts sont possibles.

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  3. #3
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    j'ai plusieurs insertion avec des relations idparent = id dans les lignes à insérer?
    Dans ce cas faire, les insertions une par une et récupérer l'id autoincrémenté via la command insert.

    Le complément à la command SQL pour récupérer l'Id varie suivant le SGBD. J'aurais pu te donner une solution testée pour Oracle, Access ou MySql.

    Pour SQL server, ce serait à base de @@IDENTITY ou SCOPE_IDENTITY:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    private static void OnRowUpdated(
      object sender, OleDbRowUpdatedEventArgs e)
    {
        // Conditionally execute this code block on inserts only.
        if (e.StatementType == StatementType.Insert)
        {
            OleDbCommand cmdNewID = new OleDbCommand("SELECT @@IDENTITY",
                connection);
            // Retrieve the Autonumber and store it in the CategoryID column.
            e.Row["CategoryID"] = (int)cmdNewID.ExecuteScalar();
            e.Status = UpdateStatus.SkipCurrentRow;
        }
    }
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  4. #4
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut
    Comment comptes-tu faire tes inserts ? Par code Client .Net ou par Code SQL ?

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  5. #5
    Membre actif Avatar de Masmeta
    Homme Profil pro
    Ing. R&D informatique industrielle
    Inscrit en
    Mai 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Ing. R&D informatique industrielle
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 472
    Points : 221
    Points
    221
    Par défaut
    je vous remercie de votre aide.

    Je suis partie sur une insertion par procédure stockée en utilisant le SCOPE_IDENTITY.
    Cela fonctionne.
    "Nulla Tenaci Invia Est Via"
    Aux persévérants aucune route n'est interdite

  6. #6
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    J'aurais pu te donner une solution testée pour Oracle, Access ou MySql.
    Je reste intéressé par la solution Access. Merci d'avance

  7. #7
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    sinople : Je reste intéressé par la solution Access.
    Voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    if (AutoIncrementColumnName!="")
       ((OleDbDataAdapter)adapter).RowUpdated += 
          new OleDbRowUpdatedEventHandler(OnOleDbRowUpdated);
    adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey ;
    ... 
    internal void OnOleDbRowUpdated(object sender, OleDbRowUpdatedEventArgs e)
    {
      if (e.StatementType==StatementType.Insert)
        e.Row[AutoIncrementColumnName] = 
           new OleDbCommand("SELECT @@IDENTITY",(OleDbConnection)DataBase.DbCnx).ExecuteScalar();
    }
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  8. #8
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    Ok donc il s'agit de modifier (surcharger) le tableadapter afin d'obtenir la prochaine incrémentation à l'aide de la commande SQL SELECT @@IDENTITY.

    Petite question pour être sur?

    Que ce passe-t-il si il y a 2 insertion en presque même temps? Le SELECT fait-il une opération d'incrémentation (donc si je double l'instruction SELECT avant l'insertion l'incrémentation avance de 2 et non pas de 1) ou l'incrémentation est effective lors de l'enregistrement (et donc idéalement il faut prévoir une transaction/Gestion erreur, car il reste un chance minime d'avoir une erreur de doublon?)

  9. #9
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    On ne peut qu'espérer que le @@IDENTITY soit fonction de la connection pour gèrer 2 insertions de 2 programmes différents.

    Si ce n'est pas le cas, il pourrait y avoir un conflit et aussi en cas de multithread sur une même connexion .
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  10. #10
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut
    C'est pourquoi je vous recommande d'utiliser scope_identity pour s'enpasser de la gestion de l'accès concurentiel.

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

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

Discussions similaires

  1. Gestion d'une liste box
    Par norwy dans le forum Windows
    Réponses: 6
    Dernier message: 01/11/2005, 12h51
  2. Gestion d'une file d'attente
    Par jesus144 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 22/09/2005, 19h58
  3. [Composite] Gestion d'une recherche avancée
    Par Loctar dans le forum Design Patterns
    Réponses: 12
    Dernier message: 23/06/2005, 18h32
  4. [Clavier] Gestion d'une invite de commandes
    Par Damian dans le forum Assembleur
    Réponses: 9
    Dernier message: 28/04/2005, 16h41
  5. gestion d'une erreur
    Par Jeannotc dans le forum Bases de données
    Réponses: 8
    Dernier message: 25/06/2004, 18h04

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