VBA,ADO.Connection和查询参数

问题描述:

我让Excel VBA脚本:
VBA,ADO.Connection和查询参数

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

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

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

您需要使用可以添加参数的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关心该名称而非识别名称。

+1

谢谢,你的代码工作正常:) – Alexey 2012-04-28 10:07:18

+2

我相信你是正确的参数顺序。当我来自C#.Net,然后编写VBScript时,这让我感到沮丧。 – Coops 2013-02-11 10:56:42

+0

或者你也可以.. 。CommandText =“SELECT * FROM table WHERE parentid =”&myparam & ";“ – 2015-04-08 10:16:25

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

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指示:

    如果指定在类型参数,则必须通的可变长度的数据类型一个Size参数,或者在将Parameter对象的Size属性附加到Parameters集合之前设置它们;否则会发生错误。

  2. 如果在cmd.CommandText被设置cmd.ActiveConnection属性设置,并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的意思,这是稍微不准确的:

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

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