子程序连接到MS Access数据库

问题描述:

我有这个子程序设置连接到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

问题是,变量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