ActiveX Data Objects (ADO)
Connection Object
VBA는 취미로
2023. 8. 31. 16:15
Connection Object
데이터 원본에 대해 열려 있는 연결을 나타냅니다.
Excel VBA에서 ADO를 사용하기 위해서는 ADO Library를 참조해야 합니다.
연결하기
다음 코드는 암시적으로 연결하는 방법입니다.
Sub GetDataFromAccessDatabase()
' 레코드셋 선언 및 인스턴스화
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset
' 암시적 연결 생성 및 레코드셋 열기
rst.Open "Titles", _
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\download\Biblio.mdb;", _
adOpenForwardOnly, _
adLockReadOnly, _
adCmdTable
' 레코드셋 닫기 및 정리
rst.Close
Set rst = Nothing
End Sub
다음 코드는 명시적으로 연결합니다.
Sub GetDataFromAccessDatabase()
' Connection 및 Recordset 선언
Dim conn As ADODB.Connection
Dim rst As ADODB.Recordset
' 인스턴스화
Set conn = New ADODB.Connection
Set rst = New ADODB.Recordset
' Connection 열기
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\download\Biblio.mdb;"
' Recordset 열기 (명시적인 Connection 사용)
rst.Open "Titles", _
conn, _
adOpenForwardOnly, _
adLockReadOnly, _
adCmdTable
' Recordset 및 Connection 닫기
rst.Close
conn.Close
' 정리
Set rst = Nothing
Set conn = Nothing
End Sub
DSN을 사용하여 데이터 원본에 연결하기
Sub ConnectToDatabase()
Dim con As Object
Set con = CreateObject("ADODB.Connection")
' DSN 이름 및 로그인 정보 설정
Dim dsnName As String
dsnName = "BiblioDSN"
' 데이터베이스 연결
con.Open dsnName
' ConnectionString 출력
Debug.Print "ConnectionString: " & con.ConnectionString
' 연결 닫기 및 정리
con.Close
Set con = Nothing
End Sub
' Output
' ConnectionString: Provider=MSDASQL.1;Data Source=BiblioDSN;
Connection 개체를 여는 두 가지 방법
1. ConnectionString을 사용하는 방법입니다.
Sub ConnectToAccessDatabase()
' Connection 선언
Dim conn As ADODB.Connection
' 인스턴스화
Set conn = New ADODB.Connection
' ConnectionString 설정 및 Connection 열기
conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\download\Biblio.mdb;"
conn.Open
Debug.Print "Connection opened with ADO Version " & conn.Version
conn.Close
' 정리
Set conn = Nothing
End Sub
' Output
' Connection opened with ADO Version 10.0
2. Open 메서드를 호출할 때 직접 연결 문자열을 전달합니다.
Sub ConnectToAccessDatabase()
' Connection 선언
Dim conn As ADODB.Connection
' 인스턴스화
Set conn = New ADODB.Connection
'Connection 열기
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\download\Biblio.mdb;"
Debug.Print "Connection opened with ADO Version " & conn.Version
conn.Close
' 정리
Set conn = Nothing
End Sub
' Output
' Connection opened with ADO Version 10.0
ConnectionString 속성 읽기
Sub ConnectToDatabase()
Dim con As ADODB.Connection
Dim rst As ADODB.Recordset
Set con = New ADODB.Connection
Set rst = New ADODB.Recordset
rst.Open "Titles", _
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\download\Biblio.mdb;", _
adOpenForwardOnly, , _
adCmdTable
Set con = rst.ActiveConnection
Debug.Print con.ConnectionString
rst.Close
con.Close
Set rst = Nothing
Set con = Nothing
End Sub
' Output
' Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;
' Data Source=D:\download\Biblio.mdb;
' Mode=Share Deny None;Jet OLEDB:System database="";
' Jet OLEDB:Registry Path="";
' Jet OLEDB:Database Password="";
' Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;
' Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;
' Jet OLEDB:New Database Password="";
' Jet OLEDB:Create System Database=False;
' Jet OLEDB:Encrypt Database=False;
' Jet OLEDB:Don't Copy Locale on Compact=False;
' Jet OLEDB:Compact Without Replica Repair=False;
' Jet OLEDB:SFP=False;
ADO 버전 번호 및 연결 상태 확인
Sub CheckADOVersion()
Dim con As ADODB.Connection
Set con = New ADODB.Connection
Debug.Print con.Version
Set con = Nothing
End Sub
' Output
' 10.0
기본 데이터베이스 변경하고 메시지 출력하기
Sub ConnectionExample()
Dim con As Object
Set con = CreateObject("ADODB.Connection")
' DSN을 사용하여 연결
con.Open "SQLNorthwindDSN"
' default database 변경
con.DefaultDatabase = "Master"
' 변경된 default database 이름 표시
Debug.Print "The default database is now set to: " & con.DefaultDatabase
' 연결 닫기 및 정리
con.Close
Set con = Nothing
End Sub
' Output
' The default database is now set to: master
데이터 액세스 권한 설정
' Connection 생성 함수
Function CreateConnection() As ADODB.Connection
Dim con As ADODB.Connection
Set con = New ADODB.Connection
Set CreateConnection = con
End Function
' Connection 열기 함수
Sub OpenConnection(con As ADODB.Connection, DSNName As String)
con.Mode = adModeShareDenyWrite ' 다른 사용자에게 쓰기 접근 권한을 제거하는 설정
con.Open "DSN=" & DSNName ' Connection 객체를 connection string으로 열기
End Sub
' 현재 권한 확인 함수
Function CheckPermissions(con As ADODB.Connection) As String
Dim sPermissions As String
Select Case (con.Mode)
Case adModeUnknown:
sPermissions = "Unknown or unset permissions."
Case adModeRead:
sPermissions = "User cannot read data."
Case adModeWrite:
sPermissions = "User cannot write data."
Case adModeReadWrite:
sPermissions = "User cannot read nor write data."
Case adModeShareDenyRead:
sPermissions = "Other users cannot read data."
Case adModeShareDenyWrite:
sPermissions = "Other users cannot write data."
Case adModeShareExclusive:
sPermissions = "Other users cannot read or write data."
Case adModeShareDenyNone:
sPermissions = "Other users cannot do anything with data."
End Select
CheckPermissions = sPermissions
End Function
' 메인 실행 서브루틴
Sub Main()
' 새로운 Connection 객체 생성
Dim conn As ADODB.Connection
Set conn = CreateConnection()
' 데이터 소스 연결 열기
OpenConnection conn, "SQLNorthwindDSN"
' 권한 확인 및 출력
Debug.Print CheckPermissions(conn)
' 연결 닫기
conn.Close
' 메모리 정리
Set conn = Nothing
End Sub
' Output
' Other users cannot write data.
연결 시간 초과 처리하기
' 데이터베이스 연결을 생성합니다.
Public Function CreateConnection() As ADODB.Connection
Dim con As New ADODB.Connection
con.ConnectionTimeout = 2
Set CreateConnection = con
End Function
' 데이터베이스에 연결합니다.
Public Sub OpenConnection(con As ADODB.Connection)
On Error GoTo ERR_OpenConnection:
con.Open "DSN=SQLNorthwindDSN"
Exit Sub
ERR_OpenConnection:
HandleErrors con
End Sub
' 데이터베이스 연결을 닫습니다.
Public Sub CloseConnection(con As ADODB.Connection)
If Not (con Is Nothing) Then
If (con.State = adStateOpen) Then
con.Close
End If
End If
End Sub
' 에러를 처리합니다.
Public Sub HandleErrors(con As ADODB.Connection)
Dim oErr As ADODB.Error
For Each oErr In con.Errors
Select Case (Err.Number)
Case adErrStillConnecting:
MsgBox "The connection timed out on attempting to open."
Case Else:
MsgBox "Other Error: " & oErr.Description
End Select
Next oErr
End Sub
' 메인 함수입니다.
Public Sub OpenDataSource()
Dim conn As ADODB.Connection
Set conn = CreateConnection()
OpenConnection conn
CloseConnection conn
Set conn = Nothing
End Sub
Execute 메서드로 SQL 문을 실행하기
Sub TestExecuteSelect()
Dim con As ADODB.Connection
Dim rst As ADODB.Recordset
Set con = New ADODB.Connection
' 데이터베이스에 연결합니다.
con.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\download\Northwind.accdb;"
' SELECT 쿼리를 실행하고, 결과를 Recordset 개체에 저장합니다.
Set rst = con.Execute("SELECT * FROM Customers", , adCmdText)
' Recordset의 모든 레코드를 순회합니다.
Do Until rst.EOF
Debug.Print "Customer ID: " & rst.Fields("CustomerID").Value & ", Address: " & rst.Fields("Address").Value
rst.MoveNext ' 다음 레코드로 이동합니다.
Loop
' Recordset 개체가 열려있다면 닫고, 메모리에서 해제합니다.
If Not (rst Is Nothing) Then
If (rst.State And adStateOpen) = adStateOpen Then
rst.Close
End If
Set rst = Nothing
End If
' Connection 개체가 열려있다면 닫고, 메모리에서 해제합니다.
If Not (con Is Nothing) Then
If (con.State And adStateOpen) = adStateOpen Then
con.Close
End If
Set con = Nothing
End If
End Sub
' 출력 결과
' Customer ID: 1, Address: 123 Oak Street
' Customer ID: 2, Address: 234 Elm Street
' Customer ID: 3, Address: 123 Elm Street
' Customer ID: 4, Address: 444 Birch Avenue
' Customer ID: 5, Address: 567 Green Avenue
' Customer ID: 6, Address: 6001 Purple Street
' Customer ID: 7, Address: 70 N Blue Water Lane
' Customer ID: 8, Address: 888 Mesquite Street
OpenSchema 메서드로 스키마 정보 검색하기
다음 코드는 데이터베이스 내의 모든 테이블 및 뷰 목록을 가져옵니다.
Sub GetTableNames()
Dim con As ADODB.Connection ' Connection 개체를 선언합니다.
Dim rst As ADODB.Recordset ' Recordset 개체를 선언합니다.
Set con = New ADODB.Connection ' Connection 개체를 생성합니다.
' 데이터베이스에 연결합니다. 이 예제에서는 Microsoft Access 데이터베이스 파일에 연결하였습니다.
con.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\download\Northwind.accdb;"
' OpenSchema 메서드를 사용하여 테이블 정보를 가져옵니다.
Set rst = con.OpenSchema(adSchemaTables)
' Recordset의 모든 레코드(여기서는 테이블 이름)를 순회합니다.
Do Until rst.EOF
Debug.Print "Table Name: " & rst.Fields("TABLE_NAME").Value
rst.MoveNext ' 다음 레코드로 이동합니다.
Loop
' Recordset 개체가 열려있다면 닫고, 메모리에서 해제합니다.
If Not (rst Is Nothing) Then
If (rst.State And adStateOpen) = adStateOpen Then
rst.Close
End If
Set rst = Nothing
End If
' Connection 개체가 열려있다면 닫고, 메모리에서 해제합니다.
If Not (con Is Nothing) Then
If (con.State And adStateOpen) = adStateOpen Then
con.Close
End If
Set con = Nothing
End If
End Sub