- ベストアンサー
ACCESSでパススルークエリにパラメータを使用したい
毎度お世話になっております。 WindowsXP、Access2003、SQLServer2000を使用しております。 ADOでSQLServerからデータを抽出したいのですが、 パラメータを使用したいと考えております。 SELECT CODE FROM テーブル1 WHERE CODE = ? とし adoCmd.CommandTimeout = 0 With adoCmd .CommandText = strSQL .CommandType = adCmdUnknown .Prepared = False .Parameters.Refresh End With adoCmd.Parameters(0).Value = InputBox(Trim(strBuf)) Set adoSet = adoCmd.Execute とすることで動作しました。 しかしSQL文を下記に変更したところエラーになりました。 SELECT t1.CODE FROM (SELECT CODE FROM テーブル1 WHERE CODE = ? ) as t1 LEFT JOIN (SELECT CODE FROM テーブル2 WHERE CODE = ? ) as t2 ON t1.CODE = t2.CODE のようにすると、 .Parameters.Refresh の部分で 実行時エラー -21474672595(80004005) 構文エラーまたはアクセス違反です。 となってしまいました。 2つの?の内、片方を定数に、片方を?にしてもエラーになりました。 ?を両方とも定数にすれば実行できました。 JOIN句がある場合に?を使ってはいけないのでしょうか。 何がエラーの原因かわからない状態です。 ご教授お願いいたします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
これかもしれません。 >http://support.microsoft.com/kb/829402/ja PRB: SQLOLEDB でのパラメータ化クエリを実行すると、アクセス違反が発生します。 少し古いですが、仕様です。と書かれているので、今もそうなのかもしれません。 要はサブクエリ内にパラメータを切るとRefreshできないようです。 従って、代替策としてはRefreshでパラメータを自動生成させず、明示的に切ることになると思います。 (データ型と長さは必要に応じて変更) With adoCmd .CommandText = strSQL .CommandType = adCmdUnknown .Parameters.Append .CreateParameter("p1", adChar, adParamInput, 8) .Parameters.Append .CreateParameter("p2", adChar, adParamInput, 8) .Prepared = False End With なお、?が2つあるならパラメータは2つ必要です。 参考になることを祈ります。
その他の回答 (1)
>リテラル値のプレースホルダとして疑問符 "?" を指定することにより、 >無名パラメータを含むクエリを作成できます。 >必要に応じて、クエリ内で任意の数の無名パラメータを指定できます。 >複数のパラメータを使用する場合は、名前付きのパラメータを使用してパラメータを区別できます。 >詳細については、「名前付きパラメータを含むクエリを作成する」を参照してください。 (SQL Server Books Online) この件かもです。
お礼
回答ありがとうございます。 「名前付きパラメータを含むクエリを作成する」 http://msdn.microsoft.com/ja-jp/library/aa275842(SQL.80).aspx を見て、 「パラメータ マーカー文字を指定する」 http://msdn.microsoft.com/ja-jp/library/aa276127(SQL.80).aspx を見ました。 しかし、正直私にはよく理解できませんでした。 申し訳ないです。 質問内容については、No.2の方の回答にて解決いたしました。 教えていただいた内容についても勉強していこうと思います。 ありがとうございました。
お礼
回答ありがとうございます。 CreateParameterを使うことで実行できました。 勉強になります。 ありがとうございました。