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

Pour vous procurer une version Microsoft Visual C# .NET de cet article, reportez-vous à 816112.

DANS CETTE TÂCHE

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é.

Retour au début
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 SystemImports System.DataImports System.Data.OleDbModule 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 SubEnd 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.


Retour au début

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.
Retour au début

Code complet

Imports SystemImports System.DataImports System.Data.OleDbModule 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 SubEnd 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) :Retour au début
Propriétés

ID d'article : 815629 - Dernière mise à jour : 05/12/2007 06:27:53 - Révision : 3.1

Microsoft ADO.NET 1.0, Microsoft ADO.NET 1.1, Microsoft Visual Basic .NET 2002 Initiation, Microsoft Visual Basic .NET 2003 Initiation

  • kbjet kbprogramming kbtsql kbsystemdata kbhowtomaster KB815629
Commentaires