27

我有 excel VBA 脚本:

Set cоnn = CreateObject("ADODB.Connection")
conn.Open "report"
Set rs = conn.Execute("select * from table" ) 

脚本工作正常,但我想为其添加参数。例如“ where (parentid = myparam )”,其中myparam设置在查询字符串之外。我该怎么做?

当然我可以修改查询字符串,但我认为这不是很明智。

4

2 回答 2

50

您需要使用可以添加参数的 ADODB.Command 对象。基本上这就是它的样子

Sub adotest()

    Dim Cn As ADODB.Connection
    Dim Cm As ADODB.Command
    Dim Pm As ADODB.Parameter
    Dim Rs as ADODB.Recordset

    Set Cn = New ADODB.Connection
    Cn.Open "mystring"
    Set Cm = New ADODB.Command
    With Cm
        .ActiveConnection = Cn
        .CommandText = "SELECT * FROM table WHERE parentid=?;"
        .CommandType = adCmdText

        Set Pm = .CreateParameter("parentid", adNumeric, adParamInput)
        Pm.Value = 1

        .Parameters.Append Pm

        Set Rs = .Execute
    End With

End Sub

CommandText 中的问号是参数的占位符。我相信,但我并不肯定,您附加参数的顺序必须与问号的顺序相匹配(当您有多个问号时)。不要因为参数被命名为“parentid”而被愚弄,因为我认为 ADO 不关心名称,而不是用于标识。

于 2012-04-27T15:56:02.833 回答
13

从函数返回命令的替代示例:

Function BuildCommand(conn As ADODB.Connection) As ADODB.Command
    Dim cmd As ADODB.Command
    Set cmd = New ADODB.Command
    cmd.ActiveConnection = conn
    cmd.CommandType = adCmdText
    cmd.Parameters.Append cmd.CreateParameter("@name", adVarChar, adParamInput, 255, "Dave")
    cmd.CommandText = "SELECT * FROM users WHERE name = @name;"
    Set BuildCommand = cmd
End Function

有几点需要注意:

  1. 当使用adVarChar数据类型时,大小参数cmd.CreateParameter(例如 255)是必需的。不提供它会导致运行时错误 3708:应用程序定义或对象定义错误,如文档中所示:

    如果在 Type 参数中指定可变长度数据类型,则必须先传递 Size 参数或设置 Parameter 对象的 Size 属性,然后再将其附加到 Parameters 集合;否则,会发生错误。

  2. 如果在cmd.ActiveConnection设置时cmd.CommandText设置了属性,并且cmd.CommandText包含命名参数,cmd.Parameters则将相应地填充。之后调用cmd.Parameters.Append可能会导致重复。例如:

    cmd.ActiveConnection = conn
    cmd.CommandType = adCmdText
    Debug.Print cmd.Parameters.Count ' 0
    
    cmd.CommandText = "SELECT * FROM users WHERE name = @name;"
    Debug.Print cmd.Parameters.Count ' 1
    
    cmd.Parameters.Append cmd.CreateParameter("@name", adVarChar, adParamInput, 255, "Dave")
    Debug.Print cmd.Parameters.Count ' 2
    

    我相信这就是文档中的意思,这有点不准确:

    如果在设置 CommandText 属性时 Command 对象的 Prepared 属性设置为 True 并且 Command 对象绑定到打开的连接,则 ADO 准备查询(即提供程序存储的查询的编译形式)当您调用 Execute 或 Open 方法时。

    作为一种解决方法,设置cmd.CommandTextcmd.ActiveConnection添加参数之后。

于 2017-12-18T18:13:37.223 回答