COMO: Recuperar o valor de identidade ao inserir registros no banco de dados Access usando 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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes 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 translation from VPE for Csharp .NET versão deste artigo, consulte 816112.

NESTA TAREFA

Sumário
Este artigo passo a passo descreve como recuperar o valor da coluna de identidade de um banco de dados do Access.

Recuperar o valor de identidade de um banco de dados Jet é diferente do SQL Server, porque um banco de dados Jet não dá suporte a comandos em lotes multi-statement. A versão do Jet OLE DB 4.0 provedor oferece suporte a consulta SELECT @@ Identity que permite recuperar o valor do campo de incremento automático que é gerado em sua conexão. Para executar a consulta SELECT @@ Identity , é recomendável que você usar outro objeto OleDbCommand . Este artigo descreve como usar um segundo OleDbCommand para recuperar o valor de coluna de identidade.

Observação: Este recurso funciona somente com bancos de dados Microsoft Jet 4.0 OLEDB. Versões anteriores do Microsoft Jet OLEDB não têm suporte para esse recurso.

back to the top
Mais Informações

Se conectar ao banco de dados do Access

Para se conectar ao banco de dados do Access e criar uma tabela com a coluna de identidade, execute estas etapas:
  1. Inicie o Microsoft Visual Studio .NET 2002.
  2. No menu arquivo , aponte para novo e, em seguida, clique em Project .
  3. Em Project Types , clique em Projetos do Visual Basic . Na seção modelos , clique em Aplicativo de console . Por padrão, Module1.vb é criado.
  4. Nome do projeto MyJetApplication e clique em OK .
  5. Substitua o código existente com o código a seguir:
    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. Modifique o nome de fonte de dados na seqüência de conexão para apontar para o seu banco de dados Access.


back to the top

Ajusta o registro o valor de coluna de identidade

Para resumir as etapas, o evento RowUpdated de DataAdapter, você pode ajustar o registro o valor da coluna de identidade que é gerado de uma coluna de uma tabela em um banco de dados do Access. No evento RowUpdated , você executará a consulta SELECT @@ IDENTITY usando outro objeto de comando e, em seguida, você irá atribuir o valor que é retornado pela consulta para a coluna de identidade. Por fim, chame o método AcceptChanges do objeto DataRow para aceitar o valor da coluna.

A interceptação o valor da coluna de identidade, execute estas etapas:
  1. Adicione o seguinte código antes do método Main para criar um segundo objeto OleDbCommand para a consulta SELECT @@ IDENTITY :
       ' Create OleDbCommand for SELECT @@IDENTITY statement   Private cmdGetIdentity As OleDbCommand
  2. Acrescentar o código a seguir ao método Main para criar uma nova instância da classe OleDbCommand :
          ' Create another command to get IDENTITY value.      cmdGetIdentity = New OleDbCommand()      cmdGetIdentity.CommandText = "SELECT @@IDENTITY"      cmdGetIdentity.Connection = cnJetDB
  3. Acrescentar o código a seguir ao método Main para manipular o evento RowUpdated :
          ' Delegate for handling RowUpdated event.      AddHandler oleDa.RowUpdated, AddressOf HandleRowUpdated
  4. Acrescente o código a seguir ao método Main para atualizar os dados. O evento RowUpdated é gerado após chamar o método Update .
          ' Update the Data      oleDa.Update(dtTest)
  5. Acrescentar o código a seguir ao método Main para descartar a tabela AutoIncrementTest e liberar 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 manipulador de evento RowUpdated ao 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 o aplicativo. Valores de coluna de identidade são exibidos na janela Output.
back to the top

Concluir a listagem 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 abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
232144INFO: Jet OLE DB Provider versão 4.0 suporta SELECT @@ Identity
Para obter mais informações, visite o seguinte site da MSDN:back to the top

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