2012-04-27 15 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の疑問符は、パラメータのプレースホルダです。私は信じていますが、私が肯定的ではないということは、あなたがパラメータを追加する順序が質問マークの順序と一致しなければならないということです(あなたが複数ある場合)。私がADOが識別のため以外の名前を気にしているとは思わないので、パラメータが "parentid"という名前になっていることにだまされないでください。

+1

ありがとうございます、あなたworkscファインコード: – Alexey

+2

私はあなたのパラメータの順序が正しいと信じています。これは私がC#.Netから来て、VBScriptをコード化したときに私を立ち上げました。 – Coops

+0

または、あなたはただ.. かもしれません。CommandText = "SELECT * FROM table WHERE parentid ="&myparam & "; " –

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 

注意するカップルの事:

adVarCharデータ型を使用する場合は、 cmd.CreateParameter(例えば255)のサイズ引数が必要です
  1. documentationに示すように、アプリケーション定義またはオブジェクト定義のエラー:

    あなたは型引数で可変長のデータ型を指定した場合、あなたはどちらかでなければなりません、パス、それは実行時エラー3708を結果供給していませんSize引数を設定するか、ParameterオブジェクトのSizeプロパティを設定してからParametersコレクションに追加します。それ以外の場合は、エラーが発生します。

  2. cmd.CommandTextが設定され、かつcmd.CommandTextという名前のパラメータが含まれているときcmd.ActiveConnectionプロパティが設定されている場合、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.CommandTextまたはcmd.ActiveConnectionと設定します。

関連する問題