Como localizar um registo com o fornecedor ADO e Jet OLE DB
Avançado: requer codificação especializada, interoperabilidade e competências multiutilizadas.
Este artigo aplica-se a um ficheiro de base de dados do Microsoft Access (.mdb) ou a um ficheiro de base de dados do Microsoft Access (.accdb).
Resumo
Este artigo demonstra como utilizar Objetos de Dados ActiveX (ADO) e OLE DB para localizar registos numa base de dados do Microsoft Jet.
Mais informações
Seguem-se dois procedimentos de exemplo. O primeiro, CreateJetDB, cria uma nova base de dados do Microsoft Jet no diretório de raiz da unidade C e preenche-a com dados. O segundo, CursorLocationTimed, demonstra como utilizar o método Find com um cursor do lado do servidor e com um cursor do lado do cliente.
Para criar estes procedimentos, siga estes passos:
Crie uma nova base de dados do Microsoft Access.
Crie um novo módulo.
No menu Ferramentas, clique em Referências e certifique-se de que as seguintes referências estão selecionadas:
Biblioteca microsoft ActiveX Data Objects 2.1 ou versão posterior
Microsoft ADO Ext. 2.1 para DDL e Segurança ou versão posterior
Escreva ou cole os seguintes procedimentos:
Sub CreateJetDB()
Dim cat As ADOX.Catalog
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim numrecords As Long
Dim i As Long
Set cat = New ADOX.Catalog
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
' Number of sample records to create
numrecords = 250000
On Error Resume Next
'Delete the sample database if it already exists.
'Change "findseek.mdb" to "findseek.accdb" for Access 2007.
'Change the Provider to "Microsoft.ACE.OLEDB.12.0" for
'Access 2007 ACCDB databases.
Kill "c:\findseek.mdb"
On Error GoTo 0
' Create a new Jet 4.0 database name findseek.mdb
'Change "findseek.mdb" to "findseek.accdb" for Access 2007.
'Change the Provider to "Microsoft.ACE.OLEDB.12.0" for
'Access 2007 ACCDB databases.
cat.Create "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=c:\findseek.mdb"
' Set the provider, open the database,
'and create a new table called tblSequential.
'Change "findseek.mdb" to "findseek.accdb" for Access 2007.
'Change the Provider to "Microsoft.ACE.OLEDB.12.0" for
'Access 2007 ACCDB databases.
cn.Provider = "Microsoft.Jet.OLEDB.4.0"
cn.Open "Data Source=c:\findseek.mdb"
cn.Execute "CREATE TABLE tblSequential (col1 long, col2 text(75));"
'Open the new table.
rs.Open "tblSequential", cn, adOpenDynamic, _
adLockOptimistic, adCmdTableDirect
' Add sample records to the tblSequential table.
For i = 0 To numrecords
rs.AddNew
rs.Fields("col1").Value = i
rs.Fields("col2").Value = "value_" & i
rs.Update
Next i
rs.Close
'Create a multifield Index on col1 and col2.
cn.Execute "CREATE INDEX idxSeqInt on tblSequential (col1, col2);"
'Close the connection
cn.Close
End Sub
Sub CursorLocationTimed()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim i, j As Long
Dim time As Variant
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
On Error GoTo ErrHandler
'Change "findseek.mdb" to "findseek.accdb" for Access 2007.
'Change the Provider to "Microsoft.ACE.OLEDB.12.0" for
'Access 2007 ACCDB databases.
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" _
& "Data Source=c:\findseek.mdb"
' Specify how ADO should open the recordset:
' adUseServer - use the native provider to perform cursor
' operations
' adUseClient - use the client cursor engine in ADO
' NOTE: adUseServer more closely resembles DAO
' Time opening a recordset and doing 1000 finds (Server cursor
' engine)
'
rs.CursorLocation = adUseServer
time = Timer
' Open the recordset and perform serveral Finds to locate records.
' Using the adCmdTableDirect opens a base table against Jet, which
' is generally the fastest, most functional way to access tables.
rs.Open "tblSequential", cn, adOpenDynamic, adLockOptimistic, _
adCmdTableDirect
For i = 0 To 1000
rs.Find "col1=" & i
Next i
Debug.Print "Sequential Find + Open (Server) = " & Timer - time
rs.Close
' Time opening a recordset and doing 1000 finds (Client cursor
' engine)
rs.CursorLocation = adUseClient
time = Timer
rs.Open "tblSequential", cn, adOpenDynamic, _
adLockOptimistic, adCmdTableDirect
For i = 0 To 1000
rs.Find "col1=" & i
Next i
Debug.Print "Sequential Find + Open (Client) = " & Timer - time
rs.Close
Exit Sub
ErrHandler:
For j = 0 To cn.Errors.Count - 1
Debug.Print "Conn Err Num : "; cn.Errors(j).Number
Debug.Print "Conn Err Desc: "; cn.Errors(j).Description
Next j
Resume Next
End Sub
Para criar a base de dados de exemplo, escreva a seguinte linha na janela Imediato e, em seguida, prima ENTER:
CreateJetDB
Para demonstrar o método Find, escreva a seguinte linha na janela Imediato e, em seguida, prima ENTER:
CursorLocationTimed
Deverá ver um resultado semelhante ao seguinte:
Localizar Sequencial + Abrir (Servidor) = 0,28125
Localizar Sequencial + Abrir (Cliente) = 5,28125
NOTA Os números resultantes podem diferir de computador para computador.
Referências
Para saber mais sobre Objetos de Dados ActiveX, veja Microsoft ActiveX Data Objects (ADO).
Comentários
https://aka.ms/ContentUserFeedback.
Brevemente: Ao longo de 2024, vamos descontinuar progressivamente o GitHub Issues como mecanismo de feedback para conteúdos e substituí-lo por um novo sistema de feedback. Para obter mais informações, veja:Submeter e ver comentários