수색…


비고

이 항목에 표시된 예제는 명확하게하기 위해 초기 바인딩을 사용하며 Microsoft ActiveX Data Object xx Library에 대한 참조가 필요합니다. 강력한 형식의 참조를 Object 로 바꾸고 적절한 경우 CreateObject 사용하여 New 만들기를 사용하여 Object 를 바꾸면 후기 바인딩으로 변환 할 수 있습니다.

데이터 소스에 연결하기

ADO를 통해 데이터 원본에 액세스하는 첫 번째 단계는 ADO Connection 개체를 만드는 것입니다. DSN, 사용자 ID 및 암호를 .Open 메서드에 전달하여 DSN 연결을 열 수도 있지만 일반적으로 연결 문자열을 사용하여 데이터 원본 매개 변수를 지정합니다.

DSN은 ADO를 통해 데이터 소스에 연결할 필요가 없습니다. ODBC 공급자가있는 모든 데이터 소스는 적절한 연결 문자열로 연결할 수 있습니다. 여러 공급자에 대한 특정 연결 문자열은이 항목의 범위를 벗어나지 만 ConnectionStrings.com 은 공급자에 적합한 문자열을 찾는 데 유용한 참조입니다.

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

데이터베이스 암호는 위의 예에서 명확성을 위해서만 연결 문자열에 포함되어 있습니다. 모범 사례는 데이터베이스 암호를 코드에 저장 하지 않도록 지시합니다. 이 작업은 사용자 입력을 통해 암호를 사용하거나 Windows 인증을 사용하여 수행 할 수 있습니다.

쿼리로 레코드 가져 오기

쿼리는 두 가지 방법으로 수행 할 수 있으며 둘 다 반환 된 행 컬렉션 인 ADO Recordset 개체를 반환합니다. 아래의 두 예제 모두 간결함을 위해 데이터 소스에 연결 예제에서 OpenDatabaseConnection 함수를 사용합니다. 데이터 원본에 전달 된 SQL의 구문은 공급자에 따라 다릅니다.

첫 번째 방법은 SQL 문을 Connection 객체에 직접 전달하는 것이며 간단한 쿼리를 실행하는 가장 쉬운 방법입니다.

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

두 번째 방법은 실행할 쿼리에 대한 ADO Command 개체를 만드는 것입니다. 약간 더 많은 코드가 필요하지만 매개 변수화 된 쿼리를 사용하려면 필요합니다.

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

데이터 소스로 보내지는 명령은 고의적이든 비 의도적이든 SQL 주입에 취약합니다 . 일반적으로 모든 종류의 사용자 입력을 연결하여 쿼리를 작성하면 안됩니다. 대신 매개 변수화해야합니다 ( 매개 변수화 된 명령 작성 참조).

비 스칼라 함수 실행하기

ADO 연결은 공급자가 SQL을 통해 지원하는 거의 모든 데이터베이스 기능을 수행하는 데 사용될 수 있습니다. 이 경우 Execute 함수가 반환 한 Recordset 은 @@ Identity 또는 유사한 SQL 명령으로 INSERT 문 다음에 키 할당을 얻는 데 유용 할 수 있지만 항상 사용할 필요는 없습니다. 아래의 예제는 간략하게 하기 위해 데이터 소스에 연결 예제에서 OpenDatabaseConnection 함수를 사용합니다.

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

데이터 소스로 보내지는 명령은 고의적이든 비 의도적이든 SQL 주입에 취약합니다 . 일반적으로 모든 종류의 사용자 입력을 연결하여 SQL 문을 작성해서는 안됩니다. 대신 매개 변수화해야합니다 ( 매개 변수화 된 명령 작성 참조).

매개 변수화 된 명령 작성

ADO 연결을 통해 실행되는 SQL은 사용자 입력을 포함해야 할 때마다 SQL 주입 기회를 최소화하기 위해 매개 변수화하는 것이 가장 좋습니다. 이 방법은 또한 긴 연결보다 읽기 쉽고보다 강력하고 유지 보수가 쉬운 코드를 용이하게합니다 (예 : Parameter 의 배열을 반환하는 함수 사용).

표준 ODBC 구문에서 매개 변수가 제공 ? 쿼리 텍스트에 "자리 표시 자"를 입력 한 다음 매개 변수가 쿼리에 나타나는 순서와 동일한 순서로 Command 에 추가됩니다.

아래 예제에서는 간략하게 하기 위해 데이터 소스연결하기OpenDatabaseConnection 함수를 사용합니다.

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

주 : 위의 예는 매개 변수화 된 UPDATE 문을 보여 주지만 모든 SQL 문에 매개 변수를 제공 할 수 있습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow