Szukaj…


Uwagi

Przykłady przedstawione w tym temacie wykorzystują wczesne wiązanie dla zachowania przejrzystości i wymagają odwołania do biblioteki Microsoft ActiveX Data Object xx. Można je przekonwertować na późne wiązanie, zastępując silnie typowane odwołania Object i zastępując tworzenie obiektów za pomocą opcji New za pomocą obiektu CreateObject stosownych przypadkach.

Nawiązywanie połączenia ze źródłem danych

Pierwszym krokiem w dostępie do źródła danych za pośrednictwem ADO jest utworzenie obiektu Connection ADO. Zazwyczaj odbywa się to za pomocą ciągu połączenia w celu określenia parametrów źródła danych, chociaż możliwe jest również otwarcie połączenia DSN poprzez przekazanie DSN, ID użytkownika i hasła do metody .Open .

Należy pamiętać, że DSN nie jest wymagane do połączenia ze źródłem danych za pośrednictwem ADO - do dowolnego źródła danych, które ma dostawcę ODBC, można podłączyć się za pomocą odpowiedniego ciągu połączenia. Podczas gdy określone parametry połączenia dla różnych dostawców są poza zakresem tego tematu, ConnectionStrings.com stanowi doskonałą pomoc w znalezieniu odpowiedniego ciągu dla twojego dostawcy.

Const SomeDSN As String = "DSN=SomeDSN;Uid=UserName;Pwd=MyPassword;"

Public Sub Example()
    Dim database As ADODB.Connection
    Set database = OpenDatabaseConnection(SomeDSN)
    If Not database Is Nothing Then
        '... Do work.
        database.Close          'Make sure to close all database connections.
    End If
End Sub

Public Function OpenDatabaseConnection(ConnString As String) As ADODB.Connection
    On Error GoTo Handler
    Dim database As ADODB.Connection
    Set database = New ADODB.Connection
    
    With database
        .ConnectionString = ConnString
        .ConnectionTimeout = 10             'Value is given in seconds.
        .Open
    End With
     
    OpenDatabaseConnection = database
     
    Exit Function
Handler:
    Debug.Print "Database connection failed. Check your connection string."
End Function

Zauważ, że hasło bazy danych jest zawarte w ciągu połączenia w powyższym przykładzie tylko dla zachowania przejrzystości. Najlepsze praktyki nakazują, aby nie przechowywać haseł bazy danych w kodzie. Można to osiągnąć, biorąc hasło za pomocą danych wprowadzonych przez użytkownika lub za pomocą uwierzytelnienia systemu Windows.

Pobieranie rekordów za pomocą zapytania

Zapytania można wykonywać na dwa sposoby, z których oba zwracają obiekt ADO Recordset który jest zbiorem zwracanych wierszy. Zauważ, że oba poniższe przykłady używają funkcji OpenDatabaseConnection z przykładu Nawiązywanie połączenia ze źródłem danych w celu skrócenia. Pamiętaj, że składnia kodu SQL przekazywanego do źródła danych zależy od dostawcy.

Pierwsza metoda polega na przekazaniu instrukcji SQL bezpośrednio do obiektu Connection i jest najłatwiejszą metodą wykonywania prostych zapytań:

Public Sub DisplayDistinctItems()
    On Error GoTo Handler
    Dim database As ADODB.Connection
    Set database = OpenDatabaseConnection(SomeDSN)
    
    If Not database Is Nothing Then
        Dim records As ADODB.Recordset
        Set records = database.Execute("SELECT DISTINCT Item FROM Table")
        'Loop through the returned Recordset.
        Do While Not records.EOF      'EOF is false when there are more records.
            'Individual fields are indexed either by name or 0 based ordinal.
            'Note that this is using the default .Fields member of the Recordset.
            Debug.Print records("Item")
            'Move to the next record.
            records.MoveNext
        Loop
    End If
CleanExit:
    If Not records Is Nothing Then records.Close
    If Not database Is Nothing And database.State = adStateOpen Then
        database.Close
    End If
    Exit Sub
Handler:
    Debug.Print "Error " & Err.Number & ": " & Err.Description
    Resume CleanExit
End Sub

Druga metoda polega na utworzeniu obiektu Command ADO dla zapytania, które chcesz wykonać. Wymaga to trochę więcej kodu, ale jest konieczne, aby użyć sparametryzowanych zapytań:

Public Sub DisplayDistinctItems()
    On Error GoTo Handler
    Dim database As ADODB.Connection
    Set database = OpenDatabaseConnection(SomeDSN)
    
    If Not database Is Nothing Then
        Dim query As ADODB.Command
        Set query = New ADODB.Command
        'Build the command to pass to the data source.
        With query
            .ActiveConnection = database
            .CommandText = "SELECT DISTINCT Item FROM Table"
            .CommandType = adCmdText
        End With
        Dim records As ADODB.Recordset
        'Execute the command to retrieve the recordset.
        Set records = query.Execute()

        Do While Not records.EOF
            Debug.Print records("Item")
            records.MoveNext
        Loop
    End If
CleanExit:
    If Not records Is Nothing Then records.Close
    If Not database Is Nothing And database.State = adStateOpen Then
        database.Close
    End If
    Exit Sub
Handler:
    Debug.Print "Error " & Err.Number & ": " & Err.Description
    Resume CleanExit
End Sub

Należy pamiętać, że polecenia wysyłane do źródła danych są podatne na wstrzykiwanie SQL , celowe lub niezamierzone. Zasadniczo zapytania nie powinny być tworzone przez łączenie danych wejściowych użytkownika. Zamiast tego należy je sparametryzować (patrz Tworzenie poleceń sparametryzowanych ).

Wykonywanie funkcji innych niż skalarne

Połączenia ADO mogą służyć do wykonywania praktycznie dowolnej funkcji bazy danych obsługiwanej przez dostawcę za pośrednictwem SQL. W takim przypadku nie zawsze konieczne jest użycie Recordset zwróconego przez funkcję Execute , chociaż może być ono przydatne do uzyskiwania przypisań klawiszy po instrukcjach INSERT za pomocą @@ Identity lub podobnych poleceń SQL. Zwróć uwagę, że w poniższym przykładzie użyto funkcji OpenDatabaseConnection z przykładu Nawiązywanie połączenia ze źródłem danych w celu skrócenia.

Public Sub UpdateTheFoos()
    On Error GoTo Handler
    Dim database As ADODB.Connection
    Set database = OpenDatabaseConnection(SomeDSN)
    
    If Not database Is Nothing Then
        Dim update As ADODB.Command
        Set update = New ADODB.Command
        'Build the command to pass to the data source.
        With update
            .ActiveConnection = database
            .CommandText = "UPDATE Table SET Foo = 42 WHERE Bar IS NULL"
            .CommandType = adCmdText
            .Execute        'We don't need the return from the DB, so ignore it.
        End With
    End If
CleanExit:
    If Not database Is Nothing And database.State = adStateOpen Then
        database.Close
    End If
    Exit Sub
Handler:
    Debug.Print "Error " & Err.Number & ": " & Err.Description
    Resume CleanExit
End Sub

Należy pamiętać, że polecenia wysyłane do źródła danych są podatne na wstrzykiwanie SQL , celowe lub niezamierzone. Zasadniczo nie należy tworzyć instrukcji SQL poprzez łączenie danych wejściowych użytkownika. Zamiast tego należy je sparametryzować (patrz Tworzenie poleceń sparametryzowanych ).

Tworzenie sparametryzowanych poleceń

Za każdym razem, gdy SQL wykonywany przez połączenie ADO musi zawierać dane wejściowe użytkownika, za najlepszą metodę uważa się jego parametryzację w celu zminimalizowania szansy na wstrzyknięcie SQL. Ta metoda jest również bardziej czytelna niż długie konkatenacje i umożliwia bardziej niezawodny i łatwiejszy do utrzymania kod (tj. Poprzez użycie funkcji, która zwraca tablicę Parameter ).

W standardowej składni ODBC podano parametry ? „symbole zastępcze” w tekście zapytania, a następnie parametry są dodawane do Command w tej samej kolejności, w jakiej występują w zapytaniu.

Zwróć uwagę, że w poniższym przykładzie użyto funkcji OpenDatabaseConnection z nawiązywania połączenia ze źródłem danych dla zwięzłości.

Public Sub UpdateTheFoos()
    On Error GoTo Handler
    Dim database As ADODB.Connection
    Set database = OpenDatabaseConnection(SomeDSN)
    
    If Not database Is Nothing Then
        Dim update As ADODB.Command
        Set update = New ADODB.Command
        'Build the command to pass to the data source.
        With update
            .ActiveConnection = database
            .CommandText = "UPDATE Table SET Foo = ? WHERE Bar = ?"
            .CommandType = adCmdText
            
            'Create the parameters.
            Dim fooValue As ADODB.Parameter
            Set fooValue = .CreateParameter("FooValue", adNumeric, adParamInput)
            fooValue.Value = 42
            
            Dim condition As ADODB.Parameter
            Set condition = .CreateParameter("Condition", adBSTR, adParamInput)
            condition.Value = "Bar"
            
            'Add the parameters to the Command
            .Parameters.Append fooValue
            .Parameters.Append condition
            .Execute
        End With
    End If
CleanExit:
    If Not database Is Nothing And database.State = adStateOpen Then
        database.Close
    End If
    Exit Sub
Handler:
    Debug.Print "Error " & Err.Number & ": " & Err.Description
    Resume CleanExit
End Sub

Uwaga: Powyższy przykład pokazuje sparametryzowaną instrukcję UPDATE, ale dowolnej instrukcji SQL można nadać parametry.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow