VBA,ADO.Connection和查询参数

问题描述 投票:22回答:2

我有excel VBA脚本:

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

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

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

vba ado
2个回答
38
投票

您需要使用可以添加参数的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不关心除了识别之外的名称。


5
投票

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

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:应用程序定义或对象定义的错误,如documentation中所示: 如果在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 我相信这就是documentation的意思,这有点不准确: 如果在设置CommandText属性时将Command对象的Prepared属性设置为True并且Command对象绑定到打开的连接,则ADO准备查询(即,由提供程序存储的查询的已编译形式)当您调用Execute或Open方法时。 作为一种解决方法,可以在添加参数后设置cmd.CommandTextcmd.ActiveConnection
© www.soinside.com 2019 - 2024. All rights reserved.