2010-01-26 6 views
0

MS Access 데이터베이스에 연결 : 그러나서브 루틴 내가 MS 액세스 데이터베이스에 연결하기 위해이 서브 루틴 설정을 가지고

Public Sub MakeDBConnection(ByVal source As String) 
    Try 
     cn = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & source & ";") 
     cn.Open() 
    Catch e As Exception 
     ReportError("CRITICAL", e.Message) 
    End Try 
End Sub 

그것은 모듈이며, 그것이 작동 모듈에서 그것을 사용하는 기능, , 시도 할 때 시도하고 모든 SQL 쿼리를 실행하는 모든 시도로 연결을 초기화해야한다는 오류와 함께 돌아올 것처럼 Main.vb (내 기본 폼)에서 그것을 사용하는 것처럼 보이지 않습니다.

공용으로 사용하는 모든 변수를 설정하려고했지만 작동하지 않습니다. 돌아올 필요가 있을까요? 나는 모른다.

감사합니다. 감사합니다.

+0

CN은 어디에 정의되어 있습니까? 이것이 전역 변수 인 경우 이것은 DB에 대한 연결을 열린 채로두기를 구하는 매우 나쁜 접근입니다. – JohnFx

+1

하지만 Jet는 연결이 열릴 때 LDB 파일을 만드는 데 엄청난 오버 헤드가 있기 때문에 재사용되는 단일 연결을 선호합니다. 물론, 연결을 신중하게 관리하지 않는 이유는 아니지만, 하나의 영구적 인 하나를 사용하는 것은 실제로 Jet의 성능 향상 및 완벽하게 유효한 방법입니다. –

답변

0

문제는 변수 cn의 범위가 Sub에 국한된다는 것입니다. 이 값을 Function으로 변경하고 OleDbConnection 개체를 반환해야합니다. 그래서 코드는 다음과 같습니다

Public Function MakeDBConnection(ByVal source As String) As OleDbConnection 
    Try 
     Dim cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & source & ";") 
     cn.Open() 

     Return cn 

    Catch e As Exception 
     ReportError("CRITICAL", e.Message) 
    End Try 
End Function 

과 같을 것이다 코드를 호출 :

' For example: 
myOleDbCommand.Connection = MakeDBConnection(source) 

는 또한 데이터 소스에 대한 app.config 파일에서 읽은 MakeDBConnection 기능을 고려해, 즉 맞는 경우 너의 건축.

+0

감사 인사, 많이 감사드립니다 :) – Matt

+0

실제로 변수를 희미하게하려면 구문을 편집했습니다 :) – HardCode

+1

cn을 정적 변수로 만들고 초기화되지 않은 경우에만 초기화 할 수 있습니까? 매개 변수를 닫기위한 메커니즘이 필요합니다 (예 : 선택적 매개 변수). –