こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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句がある場合に?を使ってはいけないのでしょうか。

何がエラーの原因かわからない状態です。
ご教授お願いいたします。

投稿日時 - 2008-10-22 16:08:28

QNo.4421082

困ってます

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

これかもしれません。
>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つ必要です。

参考になることを祈ります。

投稿日時 - 2008-10-22 18:34:21

お礼

回答ありがとうございます。

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

投稿日時 - 2008-10-23 14:56:18

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

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

この件かもです。

投稿日時 - 2008-10-22 16:52:24

お礼

回答ありがとうございます。

「名前付きパラメータを含むクエリを作成する」
http://msdn.microsoft.com/ja-jp/library/aa275842(SQL.80).aspx
を見て、
「パラメータ マーカー文字を指定する」
http://msdn.microsoft.com/ja-jp/library/aa276127(SQL.80).aspx
を見ました。
しかし、正直私にはよく理解できませんでした。
申し訳ないです。

質問内容については、No.2の方の回答にて解決いたしました。

教えていただいた内容についても勉強していこうと思います。
ありがとうございました。

投稿日時 - 2008-10-23 14:47:05

あなたにオススメの質問