我有一个VBA函数,它将执行参数化SQL。
Public Function Execute(connection As ADODB.connection, ByVal sql As String, ParamArray parameterValues()) As ADODB.Recordset
'Returns a connected ADODB.Recordset that contains the results of the specified parameterized query.
Dim parameters() As Variant
parameters = parameterValues
Set Execute = ExecuteInternal(connection, sql, parameters)
End Function
参数的数量在运行时可能会有所不同,我使用选定的范围动态构建sql字符串。一个示例sql字符串是:
DELETE FROM my_table WHERE id NOT IN (?, ?, ?)
我也希望将范围中的值传递给函数,但当然,将range.value传递给Execute函数的天真方法不会导致范围被解包。
With New SqlCommand
Set rs = .Execute(con, sql, myRange.value)
End With
如何将变体解压缩到ParamArray中?我基本上是在寻找Python*
解包操作符。
如果这是一个愚蠢的问题,请原谅,但VBA不是我的主要语言。
在VBA中调用接受ParamArray的过程时,进行调用的行实际上并没有传递数组。它传递一个或多个谨慎的参数(作为最后一个参数(,VBA(在幕后(将这些特殊参数绑定为ParamArray。
你的代码不能做同样的事情。您正在传递一个恰好是数组的参数,而在幕后,VBA会将整个数组指定为ParamArray中唯一的元素。
为了得到你想要的结果,你的调用代码需要是这样的(假设每个范围只有一个单元格(:
Set rs = .Execute(con, sql, myRange1.Value, myRange2.Value, myRange3.Value)
你可以试试这个。这基本上是";打开包装";将paramArray转换为命令对象的parameters。
Public Function Execute(connection As ADODB.connection, ByVal sql As String, ParamArray parameterValues()) As ADODB.Recordset
'Returns a connected ADODB.Recordset that contains the results of the specified parameterized query.
Dim i As Long
Dim Cm As ADODB.Command
Set Cm = New ADODB.Command
Cm.AcctiveConnection = cn
Cm.CommandType = adCmdText
Cm.CommandText = sql
For i = LBound(parameterValues) To UBound(parameterValues
Cm.Parameters.Append Cm.CreateParameter("Param", adBigInt, adParamInput, 0, parameterValues(i))
Next i
Set Execute = Cm.Execute
Set Cm = Nothing
End Function