Comment faire pour récupérer la valeur d'identité lors de l'insertion d'enregistrements dans la base de données Access à l'aide de Visual Basic .NET

Traductions disponibles Traductions disponibles
Numéro d'article: 815629 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

Résumé

Cet article explique étape par étape comment faire pour récupérer la valeur de colonne d'identité à partir d'une base de données Access.

La récupération de la valeur d'identité à partir d'une base de données Jet est différente de la récupération à partir de la base de données SQL Server car une base de données Jet ne prend pas en charge les commandes de traitement par lots multi-instruction. Le fournisseur Jet OLE DB version 4.0 prend en charge la requête SELECT @@Identity qui vous permet de récupérer la valeur du champ à incrément automatique qui est généré par votre connexion. Pour exécuter la requête SELECT @@Identity, il est recommandé d'utiliser un autre objet OleDbCommand. Cet article explique comment utiliser un deuxième objet OleDbCommand pour récupérer la valeur de la colonne d'identité.

Remarque : cette fonctionnalité fonctionne uniquement avec les bases de données Microsoft Jet OLEDB 4.0. Les versions antérieures des bases de données Microsoft Jet OLEDB ne prennent pas en charge cette fonctionnalité.

Plus d'informations

Connexion à la base de données Access

Pour se connecter à la base de données Access et créer une table avec la colonne d'identité, procédez comme suit :
  1. Démarrez Microsoft Visual Studio .NET 2002.
  2. Dans le menu Fichier, pointez sur Nouveau, puis cliquez sur Projet.
  3. Sous Types de projets, cliquez sur Projets Visual Basic. Sous la section Modèles, cliquez sur Application console. Par défaut, Module1.vb est créé.
  4. Donnez au projet le nom MyJetApplication, puis cliquez sur OK.
  5. Remplacez le code existant par le code suivant :
    Imports System
    Imports System.Data
    Imports System.Data.OleDb
    
    Module Module1
    
       Sub Main()
    
          ' Open Connection 
          Dim cnJetDB As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=YourAccessDatabase")
          cnJetDB.Open()
    
          ' If the test table does not exist, create the Table.
          Dim strSQL As String
          strSQL = "CREATE TABLE AutoIncrementTest " & _
                   "(ID int identity, Description varchar(40), " & _
                   "CONSTRAINT AutoIncrementTest_PrimaryKey PRIMARY KEY (ID))"
    
          ' Command for creating Table.
          Dim cmdJetDB As New OleDbCommand(strSQL, cnJetDB)
          cmdJetDB.ExecuteNonQuery()
    
          ' Create a DataAdaptor With Insert Command For inserting records
          Dim oleDa As New OleDbDataAdapter("Select * from AutoIncrementTest", cnJetDB)
    
    
          ' Command to Insert Records.
          Dim cmdInsert As New OleDbCommand()
          cmdInsert.CommandText = "INSERT INTO AutoIncrementTest (Description) VALUES (?)"
          cmdInsert.Connection = cnJetDB
          cmdInsert.Parameters.Add(New OleDbParameter("Description", OleDbType.VarChar, 40, "Description"))
          oleDa.InsertCommand = cmdInsert
    
          ' Create a DataTable
          Dim dtTest As New DataTable()
          oleDa.Fill(dtTest)
    
          Dim drTest As DataRow
    
          ' Add Rows to the Table
          drTest = dtTest.NewRow
          drTest("Description") = "This is a Test Row 1"
          dtTest.Rows.Add(drTest)
    
          drTest = dtTest.NewRow
          drTest("Description") = "This is a Test Row 2"
          dtTest.Rows.Add(drTest)
          
       End Sub
    
    End Module
    
  6. Modifiez le nom de la source de données dans la chaîne de connexion afin qu'elle pointe vers votre base de données Access.




Interception de la valeur de la colonne d'identité

Pour résumer les étapes, dans l'événement RowUpdated du DataAdapter, vous pouvez intercepter la valeur de la colonne d'identité qui est générée pour une colonne d'une table de la base de données Access. Dans l'événement RowUpdated, vous exécutez la requête SELECT @@IDENTITY en utilisant un autre objet Command, puis vous affectez la valeur qui est renvoyée par la requête à la colonne d'identité. Enfin, vous appelez la méthode AcceptChanges de l'objet DataRow pour accepter la valeur de colonne.

Pour intercepter la valeur de la colonne d'identité, procédez comme suit :
  1. Ajoutez le code suivant avant la méthode Main pour créer un deuxième objet OleDbCommand pour la requête SELECT @@IDENTITY :
       ' Create OleDbCommand for SELECT @@IDENTITY statement
       Private cmdGetIdentity As OleDbCommand
  2. Ajoutez le code suivant à la méthode Main pour créer une nouvelle instance de la classe OleDbCommand :
          ' Create another command to get IDENTITY value.
          cmdGetIdentity = New OleDbCommand()
          cmdGetIdentity.CommandText = "SELECT @@IDENTITY"
          cmdGetIdentity.Connection = cnJetDB
    
    
  3. Ajoutez le code suivant à la méthode Main pour gérer l'événement RowUpdated :
          ' Delegate for handling RowUpdated event.
          AddHandler oleDa.RowUpdated, AddressOf HandleRowUpdated
  4. Ajoutez le code suivant à la méthode Main pour mettre à jour les données. L'événement RowUpdated est déclenché après l'appel de la méthode Update.
          ' Update the Data
          oleDa.Update(dtTest)
    
  5. Ajoutez le code suivant à la méthode Main pour supprimer la table AutoIncrementTest et libérer les ressources :
          ' Drop the table
          cmdJetDB.CommandText = "DROP TABLE AutoIncrementTest"
          cmdJetDB.ExecuteNonQuery()
    
          ' Release the resources.
          cmdGetIdentity.Dispose()
          cmdGetIdentity = Nothing
          cmdInsert.Dispose()
          cmdInsert = Nothing
          cmdJetDB.Dispose()
          cmdJetDB = Nothing
          cnJetDB.Close()
          cnJetDB.Dispose()
          cnJetDB = Nothing
  6. Ajoutez le code de gestionnaire d'événement RowUpdated suivant à Module1 :
       ' Event handler for RowUpdated event.
       Private Sub HandleRowUpdated(ByVal sender As Object, ByVal e As OleDbRowUpdatedEventArgs)
          If e.Status = UpdateStatus.Continue AndAlso e.StatementType = StatementType.Insert Then
             ' Get the Identity column value
             e.Row("ID") = Int32.Parse(cmdGetIdentity.ExecuteScalar().ToString())
             Debug.WriteLine(e.Row("ID"))
             e.Row.AcceptChanges()
          End If
       End Sub
    
  7. Dans le menu Déboguer, cliquez sur Démarrer pour exécuter l'application. Les valeurs de colonne d'identité sont affichées dans la fenêtre de sortie.


Code complet

Imports System
Imports System.Data
Imports System.Data.OleDb

Module Module1

   ' Create OleDbCommand for SELECT @@IDENTITY statement
   Private cmdGetIdentity As OleDbCommand

   Sub Main()

      ' Open Connection 
      Dim cnJetDB As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=YourAccessDatabase")
      cnJetDB.Open()

      ' If the test table does not exist then create the Table
      Dim strSQL As String
      strSQL = "CREATE TABLE AutoIncrementTest " & _
               "(ID int identity, Description varchar(40), " & _
               "CONSTRAINT AutoIncrementTest_PrimaryKey PRIMARY KEY (ID))"

      ' Command for Creating Table
      Dim cmdJetDB As New OleDbCommand(strSQL, cnJetDB)
      cmdJetDB.ExecuteNonQuery()

      ' Create a DataAdaptor With Insert Command For inserting records
      Dim oleDa As New OleDbDataAdapter("Select * from AutoIncrementTest", cnJetDB)


      ' Command to Insert Records
      Dim cmdInsert As New OleDbCommand()
      cmdInsert.CommandText = "INSERT INTO AutoIncrementTest (Description) VALUES (?)"
      cmdInsert.Connection = cnJetDB
      cmdInsert.Parameters.Add(New OleDbParameter("Description", OleDbType.VarChar, 40, "Description"))
      oleDa.InsertCommand = cmdInsert

      ' Create a DataTable
      Dim dtTest As New DataTable()
      oleDa.Fill(dtTest)

      Dim drTest As DataRow

      ' Add Rows to the Table
      drTest = dtTest.NewRow
      drTest("Description") = "This is a Test Row 1"
      dtTest.Rows.Add(drTest)

      drTest = dtTest.NewRow
      drTest("Description") = "This is a Test Row 2"
      dtTest.Rows.Add(drTest)

      ' Create another Command to get IDENTITY Value
      cmdGetIdentity = New OleDbCommand()
      cmdGetIdentity.CommandText = "SELECT @@IDENTITY"
      cmdGetIdentity.Connection = cnJetDB

      ' Delegate for Handling RowUpdated event
      AddHandler oleDa.RowUpdated, AddressOf HandleRowUpdated

      ' Update the Data
      oleDa.Update(dtTest)

      ' Drop the table
      cmdJetDB.CommandText = "DROP TABLE AutoIncrementTest"
      cmdJetDB.ExecuteNonQuery()

      ' Release the Resources
      cmdGetIdentity.Dispose()
      cmdGetIdentity = Nothing
      cmdInsert.Dispose()
      cmdInsert = Nothing
      cmdJetDB.Dispose()
      cmdJetDB = Nothing
      cnJetDB.Close()
      cnJetDB.Dispose()
      cnJetDB = Nothing
   End Sub

   ' Event Handler for RowUpdated Event
   Private Sub HandleRowUpdated(ByVal sender As Object, ByVal e As OleDbRowUpdatedEventArgs)
      If e.Status = UpdateStatus.Continue AndAlso e.StatementType = StatementType.Insert Then
         ' Get the Identity column value
         e.Row("ID") = Int32.Parse(cmdGetIdentity.ExecuteScalar().ToString())
         Debug.WriteLine(e.Row("ID"))
         e.Row.AcceptChanges()
      End If
   End Sub
End Module

Références

Pour plus d'informations sur une rubrique connexe concernant Visual Basic 6.0, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft.
232144 INFO : Le fournisseur Jet OLE DB 4.0 prend en charge SELECT @@Identity
Pour plus d'informations, reportez-vous au site Web MSDN à l'adresse suivante (en anglais) :
Événement OleDbDataAdapter.RowUpdated
http://msdn2.microsoft.com/en-us/library/system.data.oledb.oledbdataadapter.rowupdated(vs.71).aspx

Propriétés

Numéro d'article: 815629 - Dernière mise à jour: samedi 12 mai 2007 - Version: 3.1
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft ADO.NET 1.0
  • Microsoft ADO.NET 1.1
  • Microsoft Visual Basic .NET 2002 Initiation
  • Microsoft Visual Basic .NET 2003 Initiation
Mots-clés : 
kbjet kbprogramming kbtsql kbsystemdata kbhowtomaster KB815629
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com