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:

  1. Crie uma nova base de dados do Microsoft Access.

  2. Crie um novo módulo.

  3. 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

  4. 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

  1. Para criar a base de dados de exemplo, escreva a seguinte linha na janela Imediato e, em seguida, prima ENTER:

    CreateJetDB
    
    
  2. 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).