• ベストアンサー

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句がある場合に?を使ってはいけないのでしょうか。 何がエラーの原因かわからない状態です。 ご教授お願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.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つ必要です。 参考になることを祈ります。

tokonoko
質問者

お礼

回答ありがとうございます。 CreateParameterを使うことで実行できました。 勉強になります。 ありがとうございました。

その他の回答 (1)

noname#140971
noname#140971
回答No.1

>リテラル値のプレースホルダとして疑問符 "?" を指定することにより、 >無名パラメータを含むクエリを作成できます。 >必要に応じて、クエリ内で任意の数の無名パラメータを指定できます。 >複数のパラメータを使用する場合は、名前付きのパラメータを使用してパラメータを区別できます。 >詳細については、「名前付きパラメータを含むクエリを作成する」を参照してください。 (SQL Server Books Online) この件かもです。

tokonoko
質問者

お礼

回答ありがとうございます。 「名前付きパラメータを含むクエリを作成する」 http://msdn.microsoft.com/ja-jp/library/aa275842(SQL.80).aspx を見て、 「パラメータ マーカー文字を指定する」 http://msdn.microsoft.com/ja-jp/library/aa276127(SQL.80).aspx を見ました。 しかし、正直私にはよく理解できませんでした。 申し訳ないです。 質問内容については、No.2の方の回答にて解決いたしました。 教えていただいた内容についても勉強していこうと思います。 ありがとうございました。

関連するQ&A