Så här hittar du en post med hjälp av ADO och Jet OLE DB-provider

Anteckning

Office 365 ProPlus byter namn till Microsoft 365-appar för företag. Mer information om den här ändringen finns i det här blogginlägget.

Avancerat: Kräver expertkodning, interoperabilitet och fleranvändarfärdigheter.

Den här artikeln gäller en Microsoft Access-databasfil (.mdb) eller en Microsoft Access-databasfil (.accdb).

Sammanfattning

Den här artikeln visar hur du använder ActiveX Data Objects (ADO) och OLE DB för att hitta poster i en Microsoft Jet-databas.

Mer information

Det som följer är två exempel på procedurer. Den första, CreateJetDB, skapar en ny Microsoft Jet-databas i rotkatalogen på enhet C och fyller den med data. Den andra, CursorLocationTimed, visar hur du använder metoden Sök med en serverbaserade markör och med en klientmarkör.

Följ de här anvisningarna för att skapa de här procedurerna:

  1. Skapa en ny Microsoft Access-databas.

  2. Skapa en ny modul.

  3. Klicka på Referenser på Verktyg-menyn och kontrollera att följande referenser är markerade:

    Microsoft ActiveX Data Objects 2.1 Bibliotek eller senare version

    Microsoft ADO Ext. 2.1 för DDL och säkerhet eller senare version

  4. Skriv eller klistra in följande procedurer:

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. Om du vill skapa exempeldatabasen skriver du följande rad i direktfönstret och trycker sedan på RETUR:

    CreateJetDB
    
    
  2. Du visar metoden Sök genom att skriva följande rad i direktfönstret och sedan trycka på RETUR:

    CursorLocationTimed
    
    

    Du bör se utdata ungefär så här:

    Sekventiella Sök + Öppna (Server) = 0,28125

    Sekventiella Sök + Öppna (klient) = 5,28125

    OBS! De resulterande numren kan skilja sig från dator till dator.

Referenser

Mer information om ActiveX-dataobjekt finns i Microsoft ActiveX Data Objects (ADO).