ADODBのCreateParameterは基本的には上から順に処理されるが、
サブクエリ内でParameterを使用すると、処理される順番が異なることがあるので注意。
サブクエリがなければ上から順にParamerが適用される適用される
strSql = "" strSql = strSql & " SELECT @Param1 AS 項目1" strSql = strSql & " ,@Param2 AS 項目2" strSql = strSql & " ,@Param3 AS 項目3" strSql = strSql & " FROM T_HOGE" Set adoCmd = New ADODB.Command With adoCmd .ActiveConnection = adoCn .CommandText = strSql .CommandType = adCmdText .Parameters.Append .CreateParameter("@Param1", adChar, adParamInput, 6, "111111") .Parameters.Append .CreateParameter("@param2", adChar, adParamInput, 6, "222222") .Parameters.Append .CreateParameter("@param3", adChar, adParamInput, 6, "333333") End With Set adoRS = adoCmd.Execute
上記の実行結果
項目1→"111111"
項目2→"222222"
項目3→"333333"
サブクエリがある場合、そちらを優先してパラメタが適用される
strSql = "" strSql = strSql & " SELECT @Param1 AS 項目1" strSql = strSql & " ,(SELECT CStr(@Param2) FROM T_HOGE) AS 項目2" strSql = strSql & " ,@Param3 AS 項目3" strSql = strSql & " FROM T_HOGE" Set adoCmd = New ADODB.Command With adoCmd .ActiveConnection = adoCn .CommandText = strSql .CommandType = adCmdText .Parameters.Append .CreateParameter("@Param1", adChar, adParamInput, 6, "111111") .Parameters.Append .CreateParameter("@param2", adChar, adParamInput, 6, "222222") .Parameters.Append .CreateParameter("@param3", adChar, adParamInput, 6, "333333") End With Set adoRS = adoCmd.Execute
上記の実行結果
項目1→"222222"
項目2→"111111"
項目3→"333333"
と、Parameterはサブクエリのものが優先される模様。
原因はOLE DBのバグ。ADO.NETでも同様な現象が出るようなので注意。
OLE DB Provider for Jet 4.0 または Office 12.0 Access Database Engine OLE DB Provider を 使用時にサブ クエリを持つパラメータ クエリを実行すると、予期しない結果を返す場合がある http://support.microsoft.com/kb/969850/ja
回避方法はとしては
・OLE DBではなく、ODBCを使用する、 ・パラメータステートメントを用いてSQLを生成する
がある。
動作確認環境:Access2003