복붙노트

[SQL] 엑셀 VBA에서 액세스 SQL 데이터베이스

SQL

엑셀 VBA에서 액세스 SQL 데이터베이스

나는 MSDN에서 해당 프로그램을 VBA의 코드를 복사하고 저 방법 엑셀 시트로 SQL 쿼리에서 잡아 결과 (2007 엑셀)에 :

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 데이터 참조로 2.1 라이브러리에서 개체 추가했습니다. 그리고이 데이터베이스에 액세스 할 수 있습니다.

나는이 서브 루틴을 실행할 때 지금, 그것은 오류가 있습니다 :

런타임 오류 3704 : 개체를 닫을 때 작업이 허용되지 않습니다.

문에서 :

ActiveSheet.Range("A1").CopyFromRecordset (objMyRecordset)

어떤 생각을 왜?

감사.

해결법

  1. ==============================

    1.나는 당신의 연결 문자열에 초기 카탈로그를 추가했습니다. 또한 단순히 내 자신의 SQL 문을 만드는 찬성의 ADODB.Command 구문을 포기하고 그 변수에 레코드 집합을 열했습니다.

    나는 당신의 연결 문자열에 초기 카탈로그를 추가했습니다. 또한 단순히 내 자신의 SQL 문을 만드는 찬성의 ADODB.Command 구문을 포기하고 그 변수에 레코드 집합을 열했습니다.

    도움이 되었기를 바랍니다.

    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
    
  2. ==============================

    2.제안 된 변경 :

    제안 된 변경 :

    수정 된 코드 :

    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
    
  3. ==============================

    3.나는 소프트웨어 관련 비트 없음으로 컴퓨터에 앉아있어,하지만 메모리에서 코드가 잘못 보이는 것이다. 당신은 명령을 실행하지만 레코드 집합이 objMyCommand.Execute 반환을 폐기하고 있습니다.

    나는 소프트웨어 관련 비트 없음으로 컴퓨터에 앉아있어,하지만 메모리에서 코드가 잘못 보이는 것이다. 당신은 명령을 실행하지만 레코드 집합이 objMyCommand.Execute 반환을 폐기하고 있습니다.

    내가 할 줄 :

    Set objMyRecordset = objMyCommand.Execute
    

    ... 다음 "공개 레코드"부분을 잃게됩니다.

  4. ==============================

    4.즉, 적절한 연결 문자열인가? 어디 SQL Server 인스턴스는 어디에 있습니까?

    즉, 적절한 연결 문자열인가? 어디 SQL Server 인스턴스는 어디에 있습니까?

    당신은 당신이 위의 지정된 연결 문자열을 사용하여 SQL 서버에 연결할 수 있는지 확인해야합니다.

    편집 :가 열려 있으면 레코드의 State 속성을 봐보고? 또한, 레코드를 열기 전에 adUseClient를 CursorLocation 속성을 변경합니다.

  5. ==============================

    5.(당신은 SQL Server에서 인 경우)에 저장된 프로 시저의 시작 부분에 설정 NOCOUNT를 추가합니다. 난 그냥 내 자신의 일에이 문제를 해결 그것은 레코드 내가 사용하려고했던에로드되는, 예 : "영향을받는 1203 행"로, 중간 결과에 의해 발생했다.

    (당신은 SQL Server에서 인 경우)에 저장된 프로 시저의 시작 부분에 설정 NOCOUNT를 추가합니다. 난 그냥 내 자신의 일에이 문제를 해결 그것은 레코드 내가 사용하려고했던에로드되는, 예 : "영향을받는 1203 행"로, 중간 결과에 의해 발생했다.

  6. ==============================

    6.@firedrawndagger : 목록 필드 이름에 / 열 머리글은 레코드 필드 컬렉션을 반복하고 이름을 삽입합니다 :

    @firedrawndagger : 목록 필드 이름에 / 열 머리글은 레코드 필드 컬렉션을 반복하고 이름을 삽입합니다 :

    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
    
  7. from https://stackoverflow.com/questions/1120674/accessing-sql-database-in-excel-vba by cc-by-sa and MIT license