2012-04-27 102 views
17

我讓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設置在查詢字符串的外部。我該怎麼做?

當然,我可以修改查詢字符串,但我認爲它不是很明智。

回答

25

您需要使用可以添加參數的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

1

替代示例從函數返回一個命令:

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