Vba 隐藏ADO连接字符串和记录集

Vba 隐藏ADO连接字符串和记录集,vba,excel,ado,data-hiding,Vba,Excel,Ado,Data Hiding,在我的excelvba例程中,我试图通过使作用域尽可能严格来尽可能多地隐藏代码的ADO部分 单元1: Sub control() Const strConn As String = _ "PROVIDER=SQLOLEDB.1;" & _ "PASS******=xxxxxxxxxxxxxxxxx;" & _ "PERSIST SECURITY INFO=True;" & _ "USER ID=xxxxxxxxxxxxxxxxx;" &a

在我的
excelvba
例程中,我试图通过使作用域尽可能严格来尽可能多地隐藏代码的
ADO
部分

单元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

不,它不是副本。“严格范围”位也令人困惑——没有一个。我相信在任何语言中,您都可以将您的方法局部变量作为参数传递给另一个方法,因为您决定提供什么作为参数;除非您允许,否则没有人可以窃取您的私有变量。如果您不希望您调用的代码能够检查记录集的
连接
,那么请提前填充记录集,并在传递之前清除连接。@GSerg谢谢,我也将尝试清除连接。虽然我相信ByVal实际上是在传递一个副本-如果原始参数保持不变,但新参数/arg可以独立更改,那么它肯定是一个副本。在您的过程中,保存对对象(
r
)引用的变量不能由
ByVal
被调用方更改,但对象本身可以更改。被调用的代码不能在
r
中存储不同的记录集,但它可以摆弄
r
,以任何方式更改其属性。没有发生记录集复制,对记录集的引用复制是。@GSerg在此上下文中,我不需要从
someADOproc
传回任何内容,也不需要更改
r
中的记录,所以我应该使用
ByRef
还是
ByVal
?我是否应该仅仅使用
ByVal
,因为
r
不需要更改?请记住,如果清除记录集的连接,您已经断开了它的连接,将无法再使用它写回数据库。