COMO: Obter o valor de identidade ao inserir registos na base de dados do Access utilizando o Visual Basic .NET

Traduções de Artigos Traduções de Artigos
Artigo: 815629 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sumário

Este artigo passo a passo descreve como obter o valor de coluna de identidade de uma base de dados do Access.

Obter o valor de identidade de uma base de dados do Jet é diferente do SQL Server, porque uma base de dados Jet não suporta comandos batch multi-statement. A versão de OLE DB do Jet 4.0 fornecedor suporta a consulta SELECT @@ Identity que permite obter o valor do campo de incremento automático que é gerado na ligação. Para executar a consulta SELECT @@ Identity , recomenda-se que utilize outro objecto OleDbCommand . Este artigo descreve como utilizar um segundo OleDbCommand para obter o valor de coluna de identidade.

NOTA: Esta funcionalidade só funciona com bases de dados do Microsoft Jet OLEDB 4.0. Versões anteriores do Microsoft Jet OLEDB não suportam esta funcionalidade.

Mais Informação

Ligar a base de dados do Access

Para ligar à base de dados do Access e crie uma tabela com a coluna de identidade, siga estes passos:
  1. Inicie o Microsoft Visual Studio .NET 2002.
  2. No menu ficheiro , aponte para Novo e, em seguida, clique em projecto .
  3. Em Project Types , clique em Projectos do Visual Basic . Na secção modelos , clique em Aplicação de consola . Por predefinição, é criado Module1.vb.
  4. Nome do projecto MyJetApplication e clique em OK .
  5. Substitua o código existente com o seguinte código:
    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. Modificar o nome de origem de dados na cadeia de ligação para apontar para base de dados do Access.




O valor de coluna de identidade de trap

Para resumir os passos, o evento RowUpdated de ' DataAdapter ', pode aplicar um véu o valor de coluna de identidade é gerado para uma coluna de uma tabela numa base de dados Access. No evento RowUpdated , que irá executar a consulta SELECT @@ IDENTITY utilizando outro objecto de comando e, em seguida, irá atribuir o valor devolvido pela consulta à coluna de identidade. Finalmente, chame o método AcceptChanges do objecto a aceitar o valor da coluna DataRow .

O trap o valor de coluna de identidade, siga estes passos:
  1. Adicione o seguinte código antes do método principal para criar um segundo objecto OleDbCommand para a consulta SELECT @@ IDENTITY :
       ' Create OleDbCommand for SELECT @@IDENTITY statement
       Private cmdGetIdentity As OleDbCommand
  2. Acrescentar o código seguinte o método principal para criar uma instância nova de classe OleDbCommand :
          ' Create another command to get IDENTITY value.
          cmdGetIdentity = New OleDbCommand()
          cmdGetIdentity.CommandText = "SELECT @@IDENTITY"
          cmdGetIdentity.Connection = cnJetDB
    
    
  3. Acrescentar o código seguinte método Main para processar o evento RowUpdated :
          ' Delegate for handling RowUpdated event.
          AddHandler oleDa.RowUpdated, AddressOf HandleRowUpdated
  4. Acrescentar o código seguinte método Main para actualizar os dados. O evento RowUpdated é desencadeado depois de chamar o método de actualização .
          ' Update the Data
          oleDa.Update(dtTest)
    
  5. Acrescentar o código seguinte método Main para abandonar a tabela AutoIncrementTest e libertar os recursos:
          ' 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. Adicione o seguinte código de processador do evento RowUpdated 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. No menu Debug , clique em Iniciar para executar a aplicação. Valores da coluna de identidade são apresentados na janela de resultados.


Concluir lista de código

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

Referências

Para obter informações adicionais sobre um tópico relacionado no Visual Basic 6.0, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
232144INFO: Jet OLE DB Provider versão 4.0 suporta SELECT @@ Identity
Para mais informações, visite o seguinte Web site da MSDN:
Eventos OleDbDataAdapter.RowUpdated
http://msdn2.microsoft.com/en-us/library/system.data.oledb.oledbdataadapter.rowupdated(vs.71).aspx

Propriedades

Artigo: 815629 - Última revisão: 12 de maio de 2007 - Revisão: 3.2
A informação contida neste artigo aplica-se a:
  • Microsoft ADO.NET 1.0
  • Microsoft ADO.NET 1.1
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft Visual Basic .NET 2003 Standard Edition
Palavras-chave: 
kbmt kbjet kbprogramming kbtsql kbsystemdata kbhowtomaster KB815629 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 815629

Submeter comentários

 

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