我正在构建一个应用程序,使用MS Access作为MySQL DB的前端。该应用程序由许多表单组成,所有表单都将执行许多不同的SQL语句。
我正在使用以下方式建立连接:
Dim oConn As New ADODB.Connection
Dim Server_Name As String
Dim Database_Name As String
Dim User_ID As String
Dim Password As String
Server_Name = "localhost"
Database_Name = "test"
User_ID = "root"
Password = ""
oConn.Open "DRIVER={MySQL ODBC 5.3 ANSI Driver}" _
& ";SERVER=" & Server_Name _
& ";DATABASE=" & Database_Name _
& ";UID=" & User_ID _
& ";PWD=" & Password _
& ";OPTION=16427"
我的问题是: 每次运行SQL语句时打开和关闭连接是更好,还是在应用程序运行时打开连接,在应用程序关闭时关闭?
- 如果第一种方式更好,我可以创建一个返回连接的全局函数,在当前表单中使用而不必为每个表单和/或SQL语句反复编写相同的代码吗? / p>
- 如果第二种方式更好,我可以全局声明和打开连接,那么它可以从任何形式使用吗?
请记住:
- 申请表中有50多种不同的表格和子表格。
- 应用程序应该能够在多台计算机上同时访问1个数据库。
答案 0 :(得分:1)
我有同样的问题,没有人回答它。
一般情况下,当您开始使用它并在您完成时将其关闭时,最好保持连接处于打开状态,但不是在此之前。如果你在每个表单的基础上使用它会很好,但如果它被共享它会变得更复杂。
我最初做的是打开每个表单的连接,子表单从父表单中获取连接,表单在关闭时关闭连接。
如果多个表单使用相同的连接,则问题是如果您关闭该连接,则使用它的其他表单将出错并失败。因此,如果您希望共享表单之间的连接,只需确保它永远不会关闭,除非文件被关闭。我目前正在使用这种方法,因为我有一个基本菜单'在不关闭文件的情况下无法关闭的表单,我关闭该表单的onClose连接。
另外要记住的是,计算机可能会随机与服务器断开连接,因此任何需要连接的代码都应该进行快速测试,以便在某种情况下意外关闭时重新打开连接。
编辑: 在它自己的模块中。
Public DB_CONNECTION As ADODB.Connection
Function openConnect(ByRef myconn As ADODB.Connection) As Integer
Static retries As Integer
Dim server As String
server = "localhost"
On Error GoTo connectError
myconn.ConnectionTimeout = 10
myconn.Open "DRIVER={MySQL ODBC 5.1 Driver};SERVER=" & server & "DATABASE=data;USER=" & getSQLuser & ";PASSWORD=password;Option=3"
openConnect = 1
retries = 0
Exit Function
connectError:
'retry several times on failure
Dim errADO As ADODB.Error
For Each errADO In myconn.Errors
Debug.Print vbTab & "Error Number: " & errADO.Number
Debug.Print vbTab & "Error Description: " & errADO.Description
Debug.Print vbTab & "Jet Error Number: " & errADO.SQLState
Debug.Print vbTab & "Native Error Number: " & errADO.NativeError
Debug.Print vbTab & "Source: " & errADO.Source
Debug.Print vbTab & "Help Context: " & errADO.HelpContext
Debug.Print vbTab & "Help File: " & errADO.HelpFile
If errADO.Number = -2147467259 Then
If retries < 3 Then
If MsgBox("Connection Error, Try to reconnect or close any connection-enabled forms,check your internet connection and try again.", vbCritical + vbRetryCancel, "Connection Error") = vbRetry Then
retries = retries + 1
Call openConnect(myconn)
Exit Function
End If
Else
MsgBox "Connection error. Retried 3 times, check your internet connection and/or contact your system administrator.", vbCritical + vbOKOnly, "Critical Connection Error"
retries = 0
Exit Function
End If
End If
Next
Select Case err
Case 0
Case Else
MsgBox "Error Code " & err & ", " & Error(err), vbCritical, "Error #" & err
End Select
openConnect = -1
End Function
Function closeConnect()
If Not (DB_CONNECTION Is Nothing) Then
If DB_CONNECTION.State = adStateOpen Then
DB_CONNECTION.Close
End If
End If
End Function
Function tryConnect()
Dim err
If DB_CONNECTION Is Nothing Then
Set DB_CONNECTION = New ADODB.Connection
Call openConnect(DB_CONNECTION)
Else
If Not (DB_CONNECTION.State = adStateOpen) Then
Call openConnect(DB_CONNECTION)
End If
End If
End Function
在我的情况下,我从不直接调用openConnect,但总是调用任何使用数据库的表单的tryConnect onOpen,或者在一段时间后调用之前调用(例如,保存按钮)。如果它已经打开,不会造成任何伤害,但如果不是,则可以防止错误。
closeConnect我调用菜单表单的OnError和OnClose。