我试图尽可能严格地隐藏ADO
例程中代码的Excel-vba
部分中的内容。
第1单元:
Sub control()
Const strConn As String = _
"PROVIDER=SQLOLEDB.1;" & _
"PASS******=xxxxxxxxxxxxxxxxx;" & _
"PERSIST SECURITY INFO=True;" & _
"USER ID=xxxxxxxxxxxxxxxxx;" & _
"INITIAL CATALOG=xxxxxxxxxxxxxxxxx;" & _
"DATA SOURCE=xxxxxxxxxxxxxxxxx;" & _
"USE PROCEDURE FOR PREPARE=1;" & _
"AUTO TRANSLATE=True;" & _
"CONNECT TIMEOUT=0;" & _
"COMMAND TIMEMOUT=0" & _
"PACKET SIZE=4096;" & _
"USE ENCRYPTION FOR DATA=False;" & _
"TAG WITH COLUMN COLLATION WHEN POSSIBLE=False"
Dim c As ADODB.Connection
Dim r As ADODB.Recordset
Set c = New ADODB.Connection
c.ConnectionTimeout = 0
c.Open strConn
Set r = New ADODB.Recordset
r.ActiveConnection = c
Call someADOproc(r)
End Sub
第2单元:
Sub someADOproc(ByRef ar As Object)
ar.Open _
"SELECT top 1 Operator " & _
"FROM xxxxxxxxx.dbo.xxxxxxxxxxxx "
MsgBox ar.Fields(0).Value
End Sub
例程control
中变量的严格范围让我感到惊讶ByRef
实际上有效,并且该变量在位于不同模块中的例程someADOproc
中可用吗?我原以为这会失败。
ByVal
也有效 - 这是预期的,因为它传递了记录集r
的副本?
我对这些概念的理解缺少什么?
我应该使用ByVal
还是ByRef
?