• ベストアンサー

SQL文のWHERE句でエラー

Access2000のMDBをADOで読み込もうとしていますが、WHERE句を指定すると例外が発生します。 strSQL = "SELECT * FROM Q住所録 ORDER BY [カナ]"; strWhere = "([カナ] Like \'ア*\')"; strSQL += " WHERE " + strWhere; ウォッチウィンドウでstrSQLを確認すると {"SELECT * FROM Q住所録 ORDER BY [カナ] WHERE ([カナ] Like 'ア*')"} とちゃんとなっていますが、 varTName = _T(strSQL); hr = pRs.CreateInstance( __uuidof( Recordset)); pRs->Open( varTName, _variant_t((IDispatch *)pdb), adOpenDynamic, adLockReadOnly, dCmdUnknown); でオープンすると例外が出ます。 エラーの内容は IDispatch error #3092 となっています。 WHRERE句をしていなければ全レコードがちゃんと表示されます。 WHERE句は使えないんでしょうか。 Filterプロパティの使い方もよくわかりません。 レコードの抽出の方法を教えてください。

  • kmor
  • お礼率90% (255/283)

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

  • ベストアンサー
  • utakataXEX
  • ベストアンサー率69% (711/1018)
回答No.5

Accessのクエリデザイン上での like のワイルドカードは * ですが、 ADO でのワイルドカードは一般的に % です。 その辺、変えてもダメですか?

kmor
質問者

お礼

解決です! ADOでのワイルドカードが%だとは知りませんでした。 VBでずっと*を使っていたものですから。 ありがとうございました。

その他の回答 (4)

回答No.4

こんばんは。 半角カナですか・・・。 strSQLの中身はは大丈夫で、ADOを経由している時点で文字化けしているような・・・。 LIKEの条件とカラムの内容を全角同士で比較するようなアプローチの方が無難かと・・・。 お力になれずにすみません・・・。 (^^ゞ

kmor
質問者

お礼

ありがとうございます。 そう思って全角でやってみても結果は同じでした。 WHERE句をいろいろ()でくくってみたり... もう少しがんばってみます。ありがとうございました。

回答No.3

こんにちは。 >>同じ内容でAccessのクエリーからSQLビューでSQL文を書くとちゃんと抽出されます。 SQLの問題じゃないのかなぁ・・・。 とりあえずSQL載せてください。 後はテーブルの詳細(カラムの型とか、入ってるデータとか)がわかれば嬉しいです・・・。 (^^ゞ

kmor
質問者

補足

度々ありがとうございます。 テーブル(クエリー)の内容は、 名前 テキスト型 (漢字で入っています) カナ テキスト型 (半角カナで入っています) ・・省略・・ 生年月日 日付型 グループ 数値(バイト)型 となっています。 SQL文の内容は "SELECT * FROM Q住所録 WHERE ( (グループ = 1) ) ORDER BY カナ" だとうまくいくのですが、 "SELECT * FROM Q住所録 WHERE ((カナ Like 'ア*') ) ORDER BY カナ" だと何も表示されません。 テーブルには あいうえお アイウエオ ・・・ 2 ももももも モモモモモ ・・・ 1 といったデータが入っています。 カナはwebの関係上全角表示されていますが、実際にはテーブルの中身WHERE句も半角カナです。 WHERE条件でグループを1と指定した場合、 ももももも が表示され、カナをア*と指定すると、レコードセットオープン後のEOFがTRUEとなっています。 よろしくお願いします。

回答No.2

こんにちは。 >>WHERE句は使えないんでしょうか。 ORDER BY の後には使えません・・・。 単純にSQLが間違ってます。 (^^ゞ

kmor
質問者

補足

ありがとうございます。 エラーはなくなりましたが、レコードが1件も表示されません。 同じ内容でAccessのクエリーからSQLビューでSQL文を書くとちゃんと抽出されます。 どこがいけないのでしょうか。 ちなみに、別の数値型フィールドをWhere条件で抽出するとちゃんと出ます。 Like式がいけないのでしょうか。

  • Swordline
  • ベストアンサー率42% (291/688)
回答No.1

WHERE句はORDER BYの前に書かないと駄目なような。 んなもんで、ORDER BYの前にWHERE句を書いてみてください。 ようは {"SELECT * FROM Q住所録 WHERE ([カナ] Like 'ア*') ORDER BY [カナ]"} こんな感じにすると良いのでは・・・。

kmor
質問者

お礼

そうでした。ありがとうございます。 後指摘通りなおすと、エラーはなくなったんですが、レコードが1件も表示されません。 同じ内容でAccessのクエリーからSQLビューでSQL文を書くとちゃんと抽出されます。 どこがいけないのでしょうか。 ちなみに、別の数値型フィールドをWhere条件で抽出するとちゃんと出ます。 Like式がいけないのでしょうか。

関連するQ&A

  • MySQL WHERE句のLIKE検索

    初心者ですみません。 MySQL WHERE句のLIKE検索で、引っかかった文字列を 除いた項目を表示させるにはどうしたらいいでしょうか。 例えば、 SELECT * from [テーブル名] where [フィールド名] like '%あ%'; として、「あ」が入っているレコードを検索し、 該当しないレコードを表示させる。 どうか教えてください。よろしくお願いします。

  • WHERE句だと抽出できない VBA ADO

    アクセスのADOについて質問があります。 SQL文の中でWHERE句を使ってフィルタをすると返り値が0件になるのに、 rs.Open strSQLした後に、 rs.Filterで抽出すると、適切な数値が返ります。 具体的に言うと 【1】 strSQL = "SELECT T_会社名.*, T_会社名.住所 FROM T_会社名 WHERE (((T_会社名.住所) Like ""*埼玉*""));" rs.Open strSQL, cn, adOpenKeyset, adLockOptimistic i = rs.RecordCount 【2】 strSQL = "SELECT T_会社名.*, T_会社名.住所 FROM T_会社名;" rs.Open strSQL, cn, adOpenKeyset, adLockOptimistic rs.Filter = "T_会社名.住所 like '%埼玉%'" i = rs.RecordCount だと、【2】が、適切な数値が返ります。 なぜ【1】はダメなのでしょうか?

  • SQL文 この部分はなんていうのでしょう?

    SELECT T_テーブル1.フィールド1 FROM T_テーブル1 ORDER BY T_テーブル1.フィールド1; なら、 ”ORDER BY句” SELECT T_テーブル1.フィールド1 FROM T_テーブル1 WHERE (((T_テーブル1.フィールド1)="A")); なら ”WHERE句” と言いますが、 DELETE Table1.* FROM Table1; や UPDATE テーブル1 Set テーブル1.フィールド1 = "い" WHERE (((テーブル1.フィールド1)=”あ")); や DROP Table Table1; の deleteやupdateやdropの部分は何て言うのでしょうか? そのまま、SELECT句DELETE句などというのでしょうか?

  • where order by

    where order by についてお教え下さい。 データの参照で strSQL = "select * from DATA Where TYPE_NO=" & TYPE_NO で、それぞれのタイプは表示できるのですが、 order byで降順表示したいのですが、組み合わせ方が分かりません。 ご教授下さい。

  • SQL 句の評価順

    SQL句の評価順について皆さんの意見をいただけないでしょうか? <ケース1:SELECTが最後> ・FROM ・WHERE ・GROUP ・HAVING ・ORDER ・SELECT <ケース2:SELECTがトップ> ・SELECT ・FROM ・WHERE ・GROUP ・HAVING ・ORDER <ケース3:ORDERの前にSELECT> ・FROM ・WHERE ・GROUP ・HAVING ・SELECT ・ORDER どのケースで評価されますでしょうか? ご教授お願いします。

  • 「SELECT ~  FROM テーブル名」の後に続く句は「WHERE句」と「ORDER BY句」以外にありますか?

    最近アクセスのSQL文を学びました。 選択クエリのSQL文で 「SELECT ~  FROM テーブル名」 の後に続く句は 「WHERE句」と 「ORDER BY句」以外にありますか? よろしくお願いします。

  • ORDER BY句を使用しているSQL文に関して質問です。

    ORDER BY句を使用しているSQL文に関して質問です。 SELECT文にてORDER BY句を使用した場合、SELECT結果の件数によってソート順が変わるような事はあるのでしょうか? 事象としては以下の通りです。 以下のCUSTOMERテーブルがあるとします。 |店番|顧客番号|一連番号|一連番号枝番| |MISE|KOKYAKU |ITIREN |IEIRENEDANO | |0001|11111111|00000001|000000000000| |0001|11111111|00000002|000000000000| |0001|11111111|00000003|000000000000| |0001|11111111|00000004|000000000000| |0001|11111111|00000005|000000000000| |0001|11111111|00000005|000000000001| |0001|22222222|00000001|000000000000| |0001|22222222|00000002|000000000000| |0001|22222222|00000003|000000000000| |0001|22222222|00000004|000000000000| |0001|22222222|00000005|000000000000| |0001|22222222|00000006|000000000000| |0001|22222222|00000007|000000000000| |0001|22222222|00000008|000000000000| |0001|22222222|00000009|000000000000| |0001|22222222|00000010|000000000000| |0001|22222222|00000011|000000000000| |0001|22222222|00000012|000000000000| |0001|22222222|00000013|000000000000| |0001|22222222|00000014|000000000000| |0001|22222222|00000014|000000000001| 埋め込みSQLを実行し、上記のテーブルに対し以下の条件でカーソルをオープンしました。 (1)SELECT ITIREN FROM CUSTOMER WHERE MISE = 0001 AND KOKYAKU = 11111111 ORDER BY ITIREN DESC (2)SELECT ITIREN FROM CUSTOMER WHERE MISE = 0001 AND KOKYAKU = 22222222 ORDER BY ITIREN DESC カーソルの1件目をFETCHしたところ、以下のような結果となりました。 (1) |店番|顧客番号|一連番号|一連番号枝番| |MISE|KOKYAKU |ITIREN |IEIRENEDANO | |0001|11111111|00000005|000000000001| (2) |店番|顧客番号|一連番号|一連番号枝番| |MISE|KOKYAKU |ITIREN |IEIRENEDANO | |0001|22222222|00000014|000000000000| 一連番号枝番をORDER BY句のソート条件に追加するか、WHERE句の条件についかすれば事象は解決するのですが、同様のSQLを実行しているのに結果が変わってしまうのがどうしても解せません。 もしご存知の方がいらっしゃいましたら、ご教授頂けると助かります。 テーブルの内容をごちゃごちゃと書いてしまったので、見づらくてすみません。。。 レイアウトがずれてたら更にすみませんm(_ _)m HTMLのタグって使えるんでしょうかね?

  • WITH句を使用したSQLの結果

    WITH句を使用して総件数と1~20件までのデータを同時に取得するSQLを組んでみたところ、 WITH TMP AS (SELECT ROW_NUMBER() OVER (ORDER BY NO) AS CHECKROWNUM,NAME FROM TEST_TBL ORDER BY NO) SELECT T1.ALLCNT, T2.* FROM (SELECT COUNT(*) ALLCNT FROM TMP) T1, TMP T2 WHERE T2.CHECKROWNUM BETWEEN 1 AND 20; Oracle10.2.0.3.0のバージョンで ALLCNTが21になってしまう現象が発生してしまいました。 Oracle10.2.0.4.0や9iでは発生せず正しい総件数が取得できるのですが、 バージョンによる不具合は考えられますでしょうか。 それともSQL自体なにか悪い部分があるのでしょうか。 ちなみに T2.CHECKROWNUM BETWEEN 1 AND 100; と帰るとALLCNTが101と帰ってきます。 また、WITH句を使わず下記のようにTMPの部分をWITH句で使用したSQLに 置き換えると正しくALLCNTが取れます。 SELECT T1.ALLCNT, T2.* FROM (SELECT COUNT(*) ALLCNT FROM (SELECT ROW_NUMBER() OVER (ORDER BY NO) AS CHECKROWNUM,NAME FROM TEST_TBL ORDER BY NO)) T1, (SELECT ROW_NUMBER() OVER (ORDER BY NO) AS CHECKROWNUM,NAME FROM TEST_TBL ORDER BY NO) T2 WHERE T2.CHECKROWNUM BETWEEN 1 AND 20;

  • SQL文 Where句の複数検索

    先日教えて頂いたところから自分なりに複数検索をする方法を考えて書いてみたのですが、これだとテキストボックスに複数検索条件を入力するとSQLの構文エラーになってしまいうまくいきません。 先日教えて頂いた方、見ていたらまたアドバイスを頂けたら助かります。 Private Sub コマンド11_Click() '変数の設定 Dim myDB As DAO.Database Dim myRS As Recordset Dim strCnd As String Dim strWhr As String Dim strSQL As String '定数の宣言 Const conSQL As String = "Select * From T_障害票マスタ" ' テキストボックスの値を確認 ' Nz関数を使用して、テキストとして扱える空文字に変換 strCnd = Nz(Me!テキスト1, "") '←◆コントロールの値を参照◆ '「テキスト1」の入力値を元に、Where条件句を作成 If strCnd <> "" Then '条件指定時は曖昧検索 strWhr = strWhr & " " & strWhi & " 起票日 Like '*" & strCnd & "*'" End If strCnd = Nz(Me!テキスト3, "") '←◆コントロールの値を参照◆ '「テキスト3」の入力値を元に、Where条件句を作成 If strCnd <> "" Then '条件指定時は曖昧検索 strWhr = strWhr & " And 依頼者 Like '*" & strCnd & "*'" End If strCnd = Nz(Me!テキスト5, "") '←◆コントロールの値を参照◆ '「テキスト5」の入力値を元に、Where条件句を作成 If strCnd <> "" Then '条件指定時は曖昧検索 strWhr = strWhr & " And 部署 Like '*" & strCnd & "*'" End If strCnd = Nz(Me!テキスト7, "") '←◆コントロールの値を参照◆ '「テキスト7」の入力値を元に、Where条件句を作成 If strCnd <> "" Then '条件指定時は曖昧検索 strWhr = strWhr & "And 社員番号 Like '*" & strCnd & "*'" End If strCnd = Nz(Me!テキスト9, "") '←◆コントロールの値を参照◆ '「テキスト9」の入力値を元に、Where条件句を作成 If strCnd <> "" Then '条件指定時は曖昧検索 strWhr = strWhr & "And 対象システム Like '*" & strCnd & "*'" End If 'SQL文を作成 strSQL = conSQL & vbCrLf & strWhr '自身のレコードソースに設定 Me.RecordSource = strSQL '検索結果の表示 DoCmd.OpenForm ("データ修正画面") Forms("データ修正画面").RecordSource = strSQL

  • sql文のwhere条件について

    いつもおせわになります。 AM03001の型は20桁のcharacter型です。20 spacesより以上の条件で、すべてのAM03001の照会ができますか Select AM03001 from RAM03SHOH where AM03001 >= ' ' order by AM03001

専門家に質問してみよう