说不清楚。 来一个例子分析。我想建立一个数据管理系统。 有多个窗口, 因为数据库要不停的动态更新, 所以我想把connection 跟 recordset 都在 模块里声明好, 然后在窗口里直接用。以下是我自己写的程序的一部分。首先是窗口部分:
...
Private Sub HScroll1_Change()rsp.MoveFirst
rsa.MoveFirstrsp.find "ID= " & HScroll1.Value & ""
rsa.find "ID= " & rsp.Fields!Head.Value & ""
LeaderN = rsp.Fields!Head.Value
Text1(0).Text = rsa.Fields!Name.Value
Text1(1).Text = rsp.Fields!Position.Value
Text1(3).Text = RepAbs(rsp.Fields!Salary.Value)
Text1(5).Text = rsp.Fields!Office.Value
End Sub模块部分:
Public Function cn()
Dim cnn As New ADODB.Connection
cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\db1.mdb"
Set cn = cnnEnd FunctionPublic Function rsp() Dim rspt As New ADODB.Recordset
rspt.Open "select * from power", cn, adOpenDynamic, adLockOptimistic, adCmdText
Set rsp = rsptEnd FunctionPublic Function rsa()
Dim rsat As New ADODB.Recordset
rsat.Open "select * from actors", cn, adOpenDynamic, adLockOptimistic, adCmdText
Set rsa = rsatEnd Function 我发现无论怎么按scrollbar, 始终停留在第一条记录。我按F8 一步步的追踪, 发现两个问题:1. 主窗口的命令里, 每次调用rsp 跟rsa, 就会重新连接一次数据库,效率奇低 2. rsp.find 跟rsa.find 没有任何效果。 请问应该怎么解决这两个问题? 有没有效率高一点的写法?
...
Private Sub HScroll1_Change()rsp.MoveFirst
rsa.MoveFirstrsp.find "ID= " & HScroll1.Value & ""
rsa.find "ID= " & rsp.Fields!Head.Value & ""
LeaderN = rsp.Fields!Head.Value
Text1(0).Text = rsa.Fields!Name.Value
Text1(1).Text = rsp.Fields!Position.Value
Text1(3).Text = RepAbs(rsp.Fields!Salary.Value)
Text1(5).Text = rsp.Fields!Office.Value
End Sub模块部分:
Public Function cn()
Dim cnn As New ADODB.Connection
cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\db1.mdb"
Set cn = cnnEnd FunctionPublic Function rsp() Dim rspt As New ADODB.Recordset
rspt.Open "select * from power", cn, adOpenDynamic, adLockOptimistic, adCmdText
Set rsp = rsptEnd FunctionPublic Function rsa()
Dim rsat As New ADODB.Recordset
rsat.Open "select * from actors", cn, adOpenDynamic, adLockOptimistic, adCmdText
Set rsa = rsatEnd Function 我发现无论怎么按scrollbar, 始终停留在第一条记录。我按F8 一步步的追踪, 发现两个问题:1. 主窗口的命令里, 每次调用rsp 跟rsa, 就会重新连接一次数据库,效率奇低 2. rsp.find 跟rsa.find 没有任何效果。 请问应该怎么解决这两个问题? 有没有效率高一点的写法?
然后,在模块里面定义一个全局变量cn
public cn as new ADODB.Connection
然后在模块里面定义一个过程:
sub main
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\db1.mdb"
主窗体.show
end sub然后设置工程属性:
菜单“工程”->“工程属性”->“通用”->“启动对象”->"sub main"
Private cnn As ADODB.Connection '数据库连接对象
Private Rst As ADODB.Recordset '数据库记录在需要的时候建立数据库连接,
set cnn = New ADODB.Connection
cnn.open……然后根据条件,进行查询set Rst = New ADODB.Recordset
Rst.open ……
Rst.close
进行下一个查询
……
set Rst = New ADODB.Recordset
Rst.open ……
Rst.close所有的操作完成后,关闭数据库连接
cnn.close直到所有的操作都进行完了再关闭连接
set rs=nothing
这是创建和释放rs.open
rs.close
这是打开和关闭创建和释放可以全局来做
打开和关闭必须每次做