2014-06-30 1 views
4

Excel 시트를 VBA를 통해 로컬 Access 데이터베이스에 연결하려고하는데 이전 디버그에서 잠긴 Access 데이터베이스 문제에 부딪혔습니다. 오류 3704 또는 3709 (아래 참조)가 발생할 때 디버깅하려고합니다.Excel VBA - 강제로 ADO 연결을 닫으려면 어떻게해야합니까?

이제 VBA를 처음 사용하여 데이터베이스에 올바르게 연결되지 않을 가능성이 큽니다. 데이터베이스를 강제 종료 할 수있는 방법이 있습니까? 다음

연결에 대한 코드입니다 : 상태가 열려있는 경우 그래서

Dim objAccess As Object 
    Dim strFile, strConnection As String 
    strFile = "Address of SampleDB.accdb" 

    Set objAccess = CreateObject("Access.Application") 
    Call objAccess.OpenCurrentDatabase(strFile) 

    'get the connection string 
    strConnection = objAccess.CurrentProject.Connection.ConnectionString 
    objAccess.Quit 

    Set cn = CreateObject("ADODB.Connection") 
    cn.ConnectionString = strConnection 

확인하기 위해 블록을 확인하는 경우에, 나는 썼다, 그러나 나는 "GET 런타임 때이다 오류 3074 : 운영 개체가 닫혀있을 때 허용되지 않는다 "는 cn.CloseConnection 라인에 :
If cn.State = adStateOpen Then 
     cn.Close 
     Else 
      MsgBox "The connection is already open." 
    End If 

그래서 나는 밖으로 위의 코드를 주석하고 다음으로 교체,하지만 난 얻을"런타임 오류 3079 : 연결이 없습니다 이 작업을 수행하는 데 사용됩니다.이 컨텍스트에서는 닫히거나 유효하지 않습니다. " rs.ActiveConnection = cn 행으로 설정하십시오. 그것은 (cn.State 및 adStateOpen) = adStateOpen 부분에 먼저 들어갑니다.

마지막으로 연결을 정리하려면 cn.Close와 Set cn = Nothing을 사용하십시오. 그러나 그 시점에 도달하기 전에 코드가 중지되어 Access 데이터베이스에서 나를 잠급니다. 는 SQL에서 변수를 배치 내 구문이 잘못했기 때문에

Dim iArea As String 
    Dim strSQL As String 
    Dim dId As Integer 
    iArea = "Sales" 
    strSQL = "SELECT [deptID] FROM [tblDept] WHERE [deptArea]='" & iArea & "'" 

    rs.Open 
    Set rs = cn.Execute(strSQL) 
    dId = rs.Fields(0) 
    MsgBox dId 
    rs.Close 
    Set rs = Nothing 

코드는 원래 중지 : 내가 실행 한 쿼리에 관해서는, 변수와 단지 기본 선택 문이었다. 다시 디버깅 할 수 있었던 유일한 방법은 컴퓨터를 다시 시작하는 것입니다. 모든 조언을 크게 주시면 감사하겠습니다.

+0

DAO를 Access와 함께 사용하는 것이 거의 항상 가장 좋습니다. – Fionnuala

+0

ADO 라이브러리에 대한 참조가 설정되어 있습니까? – Rory

답변

1

문제는 ADO가 적고 코드에서 오류 처리가 부족하다는 것입니다. 당신은 확실히 그것을 읽어야합니다.

지정하지 않으면 오류 처리의 기본 모드에서 메시지 상자가 표시되고 끝내기를 클릭하면 중지 된 줄에서 루틴이 종료됩니다. On Error Goto을보고 오류를 처리 한 후에 실행되는 블록을 작성하십시오. 매번 오류나 아닌지를 실행하는 코드 블록을 설정하여 연결을 닫고 개체 할당을 해제 할 수 있습니다. 이것은 코드를 닫는 코드가 반드시 실행되도록함으로써 연결을 닫도록 강제하는 방법입니다. 기본 쉘은 다음과 같습니다

에서 오류가 발생합니다 ExitMe에 코드를 넣어의 위험이 있습니다
Sub MySub() 
On Error Goto MySub_ErrorHandler 

    '...Code here... 
    '1. If error happens, goto 2. 

ExitMe: 
    '4. Clean up and run the code which needs to definitely run here. Close connections, deallocate your objects, etc. 

    '5. Finally, exit the routine with all loose ends tied up. 
    Exit Sub 
MySub_ErrorHandler: 
    '2. Handle the error here... 

    '3. Then go to ExitMe... 
    Goto ExitMe 

End Sub 

; 이 경우 코드 실행은 MySub_ErrorHandler로 다시 이동하여 무한 루프가 될 수 있습니다. 따라서 ExitMe에서 코드를주의 깊게 테스트하십시오.