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.
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:
- Inicie o Microsoft Visual Studio .NET 2002.
- No menu arquivo , aponte para novo e, em seguida, clique em Project .
- Em Project Types , clique em Projetos do Visual Basic . Na seção modelos , clique em Aplicativo de console . Por padrão, Module1.vb é criado.
- Nome do projeto MyJetApplication e clique em OK .
- Substitua o código existente com o código a seguir:
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
- Modifique o nome de fonte de dados na seqüência de conexão para apontar para o seu banco de dados Access.
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:
- 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
- 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
- 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 - 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)
- 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 - 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
- No menu Debug , clique em Iniciar para executar o aplicativo. Valores de coluna de identidade são exibidos na janela Output.
Concluir a listagem 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
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:
232144
(http://support.microsoft.com/kb/232144/EN-US/
)
INFO: Jet OLE DB Provider versão 4.0 suporta SELECT @@ Identity
Para obter mais informações, visite o seguinte site da MSDN:
ID do artigo: 815629 - Última revisão: sábado, 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
| kbmt kbjet kbprogramming kbtsql kbsystemdata kbhowtomaster KB815629 KbMtpt |
Tradução automáticaIMPORTANTE: 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
(http://support.microsoft.com/kb/815629/en-us/
)