2010-01-26 60 views
0

我有這個子程序設置連接到MS Access數據庫:子程序連接到MS Access數據庫

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 

這是一個模塊,並使用它,它的工作原理與模塊中的任何功能,但,當我嘗試從Main.vb(我的主窗體)嘗試並使用它時,它似乎沒有做任何事情,因爲任何執行SQL查詢的嘗試都返回錯誤,說我必須初始化連接。

我曾嘗試設置它用於Public的所有變量,但它不起作用。也許我需要回報一些東西?我不知道。

任何幫助表示讚賞,謝謝。

+0

CN定義在哪裏?如果它是一個全局變量,這是一個非常糟糕的方法,它會請求連接到您的數據庫打開。 – JohnFx 2010-01-26 22:24:32

+1

但Jet更喜歡重複使用單個連接,特別是因爲打開連接時創建LDB文件的開銷很大。當然,這不是沒有理由不仔細管理你的連接,但使用單個持久連接實際上是Jet的性能增強器,並且是一個完全有效的實踐。 – 2010-01-27 03:12:49

回答

0

問題是,變量cn的作用域是Sub的本地作用域。您應該將其更改爲一個函數並返回一個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 2010-01-26 22:32:28

+0

我對語法進行了編輯,以實際變暗cn變量:) – HardCode 2010-01-26 22:34:15

+1

只有在尚未初始化的情況下,您是否可以使cn成爲靜態變量並進行初始化?您可能需要一個關閉它的機制(例如,一個可選參數)。 – 2010-01-27 03:14:26

相關問題