Excel-VBA에서 SQL 데이터베이스 액세스
SQL 쿼리의 결과를 Excel 시트(Excel 2007)로 가져오는 방법을 보여주는 VBA 코드 스니펫을 MSDN에서 복사합니다.
Sub GetDataFromADO()
'Declare variables'
Set objMyConn = New ADODB.Connection
Set objMyCmd = New ADODB.Command
Set objMyRecordset = New ADODB.Recordset
'Open Connection'
objMyConn.ConnectionString = "Provider=SQLOLEDB;Data Source=localhost;User ID=abc;Password=abc;"
objMyConn.Open
'Set and Excecute SQL Command'
Set objMyCmd.ActiveConnection = objMyConn
objMyCmd.CommandText = "select * from myTable"
objMyCmd.CommandType = adCmdText
objMyCmd.Execute
'Open Recordset'
Set objMyRecordset.ActiveConnection = objMyConn
objMyRecordset.Open objMyCmd
'Copy Data to Excel'
ActiveSheet.Range("A1").CopyFromRecordset (objMyRecordset)
End Sub
Microsoft ActiveX Data Objects 2.1 라이브러리를 참조로 이미 추가했습니다.그리고 이 데이터베이스에 액세스할 수 있습니다.
이 서브루틴을 실행하면 다음과 같은 오류가 발생합니다.
런타임 오류 3704: 개체가 닫힌 경우에는 작업이 허용되지 않습니다.
성명서에서:
ActiveSheet.Range("A1").CopyFromRecordset (objMyRecordset)
왜 그런지 추측이라도?
감사해요.
초기 카탈로그를 연결 문자열에 추가했습니다.저도 ADODB를 포기했습니다.명령 구문을 사용하여 나만의 SQL 문을 만들고 해당 변수에 대한 레코드 집합을 엽니다.
이게 도움이 되길 바랍니다.
Sub GetDataFromADO()
'Declare variables'
Set objMyConn = New ADODB.Connection
Set objMyRecordset = New ADODB.Recordset
Dim strSQL As String
'Open Connection'
objMyConn.ConnectionString = "Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=MyDatabase;User ID=abc;Password=abc;"
objMyConn.Open
'Set and Excecute SQL Command'
strSQL = "select * from myTable"
'Open Recordset'
Set objMyRecordset.ActiveConnection = objMyConn
objMyRecordset.Open strSQL
'Copy Data to Excel'
ActiveSheet.Range("A1").CopyFromRecordset (objMyRecordset)
End Sub
제안된 변경 사항:
- Command 개체의 Execute 메서드를 호출하지 않습니다.
- Recordset 개체의 Source 속성을 Command 개체로 설정합니다.
- 매개 변수 없이 Recordset 개체의 Open 메서드를 호출합니다.
- 호출의 Recordset 개체 주위에서 괄호를 제거합니다.
CopyFromRecordset
; - 실제로 변수를 선언합니다 :)
수정된 코드:
Sub GetDataFromADO()
'Declare variables'
Dim objMyConn As ADODB.Connection
Dim objMyCmd As ADODB.Command
Dim objMyRecordset As ADODB.Recordset
Set objMyConn = New ADODB.Connection
Set objMyCmd = New ADODB.Command
Set objMyRecordset = New ADODB.Recordset
'Open Connection'
objMyConn.ConnectionString = "Provider=SQLOLEDB;Data Source=localhost;User ID=abc;Password=abc;"
objMyConn.Open
'Set and Excecute SQL Command'
Set objMyCmd.ActiveConnection = objMyConn
objMyCmd.CommandText = "select * from mytable"
objMyCmd.CommandType = adCmdText
'Open Recordset'
Set objMyRecordset.Source = objMyCmd
objMyRecordset.Open
'Copy Data to Excel'
ActiveSheet.Range("A1").CopyFromRecordset objMyRecordset
End Sub
그것은 올바른 연결 문자열입니까?
SQL Server 인스턴스는 어디에 있습니까?
위에서 지정한 연결 문자열을 사용하여 SQL Server에 연결할 수 있는지 확인해야 합니다.
편집: 레코드 집합의 상태 속성을 보고 열기 여부를 확인하십시오.
또한 레코드 집합을 열기 전에 CursorLocation 속성을 adUseClient로 변경합니다.
저는 관련 소프트웨어가 전혀 없는 컴퓨터에 앉아 있는데, 기억으로는 그 코드가 잘못된 것 같습니다.명령을 실행 중이지만 다음을 삭제합니다.RecordSet
그거objMyCommand.Execute
돌아온다.
제가 할게요.
Set objMyRecordset = objMyCommand.Execute
...그러면 "열린 레코드 집합" 부분이 손실됩니다.
더하다set nocount on
저장된 프로세스의 시작 부분으로 이동합니다(SQL Server에 있는 경우).나는 방금 이 문제를 내 작업에서 해결했고 그것은 다음과 같은 중간 결과에 의해 발생했습니다."1203 Rows Affected"
에 로드됨Recordset
저는 사용하려고 했습니다.
@firewrinkdagger: 레코드 집합 Fields 컬렉션을 통해 반복되는 필드 이름/열 헤더를 나열하고 이름을 삽입합니다.
Dim myRS as ADODB.Recordset
Dim fld as Field
Dim strFieldName as String
For Each fld in myRS.Fields
Activesheet.Selection = fld.Name
[Some code that moves to next column]
Next
언급URL : https://stackoverflow.com/questions/1120674/accessing-sql-database-in-excel-vba
'programing' 카테고리의 다른 글
Xcode의 아카이빙 프로젝트가 다중 애플리케이션 번들을 잘못 생성함 (0) | 2023.05.17 |
---|---|
복잡한 Git 분기 이름으로 모든 Git 명령이 중단되었습니다. (0) | 2023.05.17 |
WPF의 활성 창을 참조하시겠습니까? (0) | 2023.05.17 |
특정 리비전으로 이동 (0) | 2023.05.17 |
여러 줄의 JSON으로 컬 (0) | 2023.05.17 |