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

VB.NET Discussion :

Obtenir ID d'un nouvel enregistrement


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 11
    Par défaut Obtenir ID d'un nouvel enregistrement
    Bonjour,
    Je développe une appli en VB10 et j'utilise access 2007 en base de donnée.

    J'ai cherché sur les différents forums mais je n'ai rien trouvé de concluant.

    Voici mon problème :

    En résumé :

    J'utilise sur une table un identifiant automatique.
    Après l'ajout d'un nouvelle enregistrement j'ai besoin d'obtenir cet identifiant pour l'intégrer dans une autre table. Comment puis je l'obtenir en VB ?

    En détail :

    J'ai 2 tables dont une utilise en clef primaire un champ en numéroauto.
    un champ de la deuxième table (qui n'est pas lié à la 1ere) est la valeur de la clef primaire de la 1ere table.

    En Vb via un dataset je fait une nouvelle ligne pour mon nouvelle enregistrement puis ensuite je met a jour via un constructeur (oledb).
    Tout ceci marche très bien et les enregistrement ce font bien sauf que je n'ai pas la valeur.
    J'ai bien trouvé dans des forums des "bidouilles" pour récupérer ou anticiper cette valeur ou la future valeur mais le soucis c'est que c'est de la "bricole" et que cela ne marche pas dans tous les cas.
    Est ce qu'il n'existe pas une véritable méthode efficace pour obtenir cette valeur ?

    Merci de votre aide.

  2. #2
    Membre chevronné Avatar de Jerede
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2010
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mai 2010
    Messages : 271
    Par défaut
    Bonjour,

    SELECT @@Identity

  3. #3
    Expert confirmé 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
    Par défaut
    Voici le principe (en C#) :
    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
     
    // après la création des dataAdapter
    MyDataAdapter.RowUpdated += OnOleDbRowUpdate;
     
    // aprés la création de l'InsertCommand par le CommandBuilder
    MyDataAdapter.InsertCommand.CommandText= MyDataAdapter.InsertCommand.CommandText.Replace("xxxId,","") ; 
    // ??? : vérifier si il n'y pas des blancs dans ("xxxId,")
    MyDataAdapter.InsertCommand.Parameters.RemoveAt(0) ;
    // ??? : vérifier que le paramètre 0 correspond à xxxId
     
    internal void OnOleDbRowUpdate(object sender, OleDbRowUpdatedEventArgs e)
    {
    if (e.StatementType==StatementType.Insert)
    {
    OleDbCommand cmd = new OleDbCommand("SELECT @@IDENTITY",cnx);
    e.Row["xxxId"] = cmd.ExecuteScalar();
    }
    }

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 11
    Par défaut
    Bonjour,

    Effectivement il faut utiliser la requete : Select @@IDENTITY
    La requete s'execute sur un autre objet OleDBCommand.
    Voici ma solution tiré du support microsoft.
    Merci à Grafitto et jerede pour leur réponse respective.

    Je vous dépose ma solution en espérant qu'elle puisse aider.

    N'hésitez pas à commenter ou corriger s'il y a des erreurs.
    Un peu de compréhension je débute


    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
     
    Public Sub CreatInterv(ByRef linterv As ClassPI.Intervenant)
     
            ctn = New System.Data.OleDb.OleDbConnection(My.Settings.ConnectionString)
            cmd = New OleDbCommand
            cmd.Connection = ctn
     
            'Création du 2eme objet OleDBCommand pour executer la requete
            cmdGetIdentity = New OleDbCommand()
            cmdGetIdentity.CommandText = "SELECT @@IDENTITY"
            cmdGetIdentity.Connection = ctn
     
     
     
            'Chargement de tous les Intervenant de la base
            cmd.CommandText = "select * from Intervenant"
     
            'création du Dataset contenant tous les enregistrements
            ds = New DataSet
            da = New OleDbDataAdapter
     
     
            da.SelectCommand = cmd
            da.Fill(ds, "Intervenant")
            Table = ds.Tables("Intervenant")
     
            'création d'une nouvelle ligne d'un nouvel intervenant dans le ds
            Dim nouvelIntervenant As DataRow
            nouvelIntervenant = ds.Tables("Intervenant").NewRow()
     
            With linterv
     
     
     
                nouvelIntervenant("Int_Type") = .Int_Type
                nouvelIntervenant("Int_Nom") = .Int_Nom
                nouvelIntervenant("Int_Prenom") = .Int_Prenom
                'etc...
     
            End With
     
            'ajout de la ligne dans le ds intervenant
            ds.Tables("Intervenant").Rows.Add(nouvelIntervenant)
     
            AddHandler da.RowUpdated, AddressOf HandleRowUpdated
     
            Dim lignes() As DataRow
     
            lignes = Table.Select(Nothing, Nothing, DataViewRowState.Added)
     
            'création d'un constructeur pour la mise à jour
            Dim bldr = New OleDbCommandBuilder(da)
     
            'Mise à jour dans access et l'evenement insert s'active
            da.Update(Table)
     
        End Sub
     
     
        ' Gestion de l'évènement HandleRowUpdated.
        Private Sub HandleRowUpdated(ByVal sender As Object, ByVal e As OleDbRowUpdatedEventArgs)
            If e.Status = UpdateStatus.Continue AndAlso e.StatementType = StatementType.Insert Then
                ' C'est ici qu'on récupère l'ID du nouvel enregistrement, CQFD
                e.Row("Int_ID") = Int32.Parse(cmdGetIdentity.ExecuteScalar().ToString())
     
                e.Row.AcceptChanges()
            End If
        End Sub

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

Discussions similaires

  1. Nouvel enregistrement
    Par arjo54 dans le forum Access
    Réponses: 2
    Dernier message: 30/10/2005, 19h22
  2. Nouvel enregistrement
    Par zut94 dans le forum Access
    Réponses: 1
    Dernier message: 25/10/2005, 13h32
  3. Réponses: 2
    Dernier message: 29/09/2005, 14h00
  4. comment avoir un nouvel enregistrement
    Par legillou dans le forum Access
    Réponses: 3
    Dernier message: 23/06/2005, 14h21
  5. Affichage du nouvel Enregistrement
    Par estancha dans le forum IHM
    Réponses: 8
    Dernier message: 13/10/2004, 15h23

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