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
不需要更改?请记住,如果清除记录集的连接,您已经断开了它的连接,将无法再使用它写回数据库。