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

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
Para obter uma Microsoft Visual C# .NET versão deste artigo, consulte 816112.

NESTA TAREFA

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.

back to the top
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 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. Modificar o nome de origem de dados na cadeia de ligação para apontar para base de dados do Access.


back to the top

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.
back to the top

Concluir lista de código

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
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:back to the top

Aviso: Este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 815629 - Última Revisão: 05/12/2007 06:27:53 - Revisão: 3.2

Microsoft ADO.NET 1.0, Microsoft ADO.NET 1.1, Microsoft Visual Basic .NET 2002 Standard Edition, Microsoft Visual Basic .NET 2003 Standard Edition

  • kbmt kbjet kbprogramming kbtsql kbsystemdata kbhowtomaster KB815629 KbMtpt
Comentários