• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ADOの結果が0になる)

ADOの結果が0になる

このQ&Aのポイント
  • ADOを使用して実行したクエリの結果が0になってしまう現象が発生しています。クエリには200レコードが存在しているのに、なぜ結果が0になるのか疑問です。
  • Access 2010で使用するADOを利用したクエリの結果が予期せず0になる現象について質問です。実際にはクエリには200レコードが存在しているにも関わらず、なぜ結果が0となるのか理解できません。
  • ADOを使用したクエリの実行結果が0になってしまう問題が発生しています。実際にはクエリには200レコードが存在するはずなのに、結果が0になる理由が分かりません。Access 2010を使用しています。

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

  • ベストアンサー
回答No.6

PS. Accessのバックステージビュー → オプション オブジェクトデザイナー の『SQL サーバー互換構文(ANSI92)』にチェックを入れると クエリのSQL文のワイルドカードの扱いも変更されます。 https://support.office.com/ja-jp/article/Access-%e3%83%af%e3%82%a4%e3%83%ab%e3%83%89%e3%82%ab%e3%83%bc%e3%83%89%e6%96%87%e5%ad%97%e3%83%aa%e3%83%95%e3%82%a1%e3%83%ac%e3%83%b3%e3%82%b9-af00c501-7972-40ee-8889-e18abaad12d1?CorrelationId=8c988cd6-355d-44da-8366-7da212490032&ui=ja-JP&rs=ja-JP&ad=JP 既存のクエリのSQL文の変更を行ったとしたら コードは質問文のままでも機能するハズです。 チェックを入れる前のSQL文 SELECT T1.FF1, T1.FF2 FROM T1 WHERE (((T1.FF2) Like "*あ*")); 入れた後 SELECT T1.FF1, T1.FF2 FROM T1 WHERE (((T1.FF2) ALike "*あ*")); ワイルドカード修正 SELECT T1.FF1, T1.FF2 FROM T1 WHERE (((T1.FF2) ALike "%あ%")); ALike でも Like でも機能するようですが詳細未検証です。 蛇足かも。。。 当初、RecordCountは0ではなくて-1の間違いじゃないのか?と思いましたが adOpenStatic を指定しているとレコード数を返してくれるようですね。 rs.Open "SELECT * FROM クエリ", cn, adOpenStatic, adLockOptimistic Debug.Print rs.RecordCount, rs.CursorType, rs.LockType LockType 指定なし・         1   3   1 adLockReadOnly (1)     1   3   1 adLockPessimistic (2)   1   1   4 adLockOptimistic (3)    1   1   3 adLockBatchOptimistic (4) 1   1   4 adLockPessimistic を指定しても adLockBatchOptimistic (4)に何故なるかは不明です。。。 CursorType も LockType も指定しなかった場合 rs.Open "SELECT * FROM クエリ", cn -1   3   1 -1 が返ってきます(レコード数の取得に失敗)。 以上、ご参考までにということで。

JJCOAIRLNKZJU
質問者

お礼

ありがとうございました。

その他の回答 (6)

回答No.7

-1でなく0ということはSQL文に問題あり! って、ことは当然なのに先の回答。で、不具合はワイルドカードにありってのも気付くべし。そういう意味ではお門違いの回答でした。そこで、ハスキー流の対策を補足しておきます。 Public Function PatternMatch(ByVal strText1 As String, ByVal strText2 As String) As Boolean   PatternMatch = strText1 Like strText2 End Function いわゆるAccessではなくSQL Serverのそれに一部準じているのがADOのSQL文の約束事。その中でも戸惑うのがパターンマッチ文。上記のPatternMatch()は、その矛盾を解消するためのものです。 【クエリ[D1]】 SELECT AAAA.ID, AAAA.受付CD, AAAA.科目CD, AAAA.金額, * FROM AAAA WHERE PatternMatch(AAAA.科目CD,"000*");

JJCOAIRLNKZJU
質問者

お礼

ありがとうございました。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.5

すみません。 No4で、 「No2さんの回答でいいと思いますので、」 と書きましたが、 「No3さんの回答でいいと思いますので、」 です。また、 「要するに、No2さんの回答通りです。」 と書きましたが、 「要するに、No3さんの回答通りです。」 です。 No2さん、No3さん重ね重ね失礼しました。

JJCOAIRLNKZJU
質問者

お礼

ありがとうございました。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

No2さんの回答でいいと思いますので、 私からは、 >http://okwave.jp/qa/q9000184.html 上記とほぼ内容が同じなので、そのまま引用しますと、 DAOで書いた部分はいいのですが、ADOに変換するときに そのままSQL文をそのまま使ってしまい、本来ならば データが表示されないのですが、質問された方が どちらを採用されたかわからないので、訂正しますと、 strSQL = "SELECT TPW.サイト名, TPW.Password, Max(TPW.日付) AS 最終登録日 FROM TPW GROUP BY TPW.サイト名 HAVING (TPW.サイト名 Like '*" & partSQL & "*');" は、 strSQL = "SELECT TPW.サイト名, TPW.Password, Max(TPW.日付) AS 最終登録日 FROM TPW GROUP BY TPW.サイト名 HAVING (TPW.サイト名 Like '%" & partSQL & "%');" のように、ADOではワイルドカードは「*」ではなく、「%」を 使います。つまり、 (TPW.サイト名 Like '*" & partSQL & "*') を、 (TPW.サイト名 Like '%" & partSQL & "&') のように変更する必要があります。 もし、上記を質問された方が見られていたら、 訂正を、ということと、現在の質問の方には これを踏まえて、 (1) 「クエリ」のワイルドカードを「*」から「%」に変更する。 つまり、 [TPWID]![サイト名]) Like "*test*" を [TPWID]![サイト名]) Like "%test%" にする。 (2) クエリの内容をSQL文でVBAのなかに書き込んで、 これからレコードを取り出す。このときには 当然ながら、ワイルドカードは「%」を使用する。 (3) DAOで書いて、ワイルカードはそのままで、 「クエリ」をそのまま使用する。 要するに、No2さんの回答通りです。

JJCOAIRLNKZJU
質問者

お礼

ありがとうございました。

回答No.3

>WHERE ((([TPWID]![サイト名]) Like "*test*")) ここでワイルドカード * を使用しているから。 > "SELECT * FROM クエリ",で「クエリ」が再評価されますが ADOを使用中なのでクエリ中のSQL文もADOに従って行われます。 "*test*" のワイルドカード * は ADOの場合、% です。 したがって、*test* という単語そのものを探すのでレコード数はゼロになります。 DAOで処理するか、 レコード数の確認なら、Dcount("*","クエリ")で調べるとか・・・になるかと。

JJCOAIRLNKZJU
質問者

お礼

ありがとうございました。

回答No.2

× MsgBox "実行時にエラーが発生しました。(ChangeFieldName)" & Chr$(13) & Chr$(13) 〇 MsgBox "実行時にエラーが発生しました。(GetRecordCount)" & Chr$(13) & Chr$(13) 急ぎ仕事でしたのでちょっと訂正し忘れがありました。

JJCOAIRLNKZJU
質問者

お礼

ありがとうございました。

回答No.1

Q、なぜ0が返るのでしょうか? A、全体像が見えないので・・・。 でも、通常は200を返すと思います。 Public Function GetRecordCount(ByVal strSQL As String) As Long On Error GoTo Err_GetRecordCount   Dim cnn  As ADODB.Connection   Dim rst  As ADODB.Recordset      Set cnn = CurrentProject.Connection   Set rst = New ADODB.Recordset      cnn.Errors.Clear   cnn.BeginTrans     With rst       .Open strSQL, cnn, adOpenStatic, adLockOptimistic       If Not .BOF Then         GetRecordCount = .RecordCount       End If     End With   cnn.CommitTrans   rst.Close   cnn.Close Exit_GetRecordCount:   Exit Function Err_GetRecordCount:   MsgBox "実行時にエラーが発生しました。(ChangeFieldName)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13), vbExclamation, " 関数エラーメッセージ"   Resume Exit_GetRecordCount End Function

JJCOAIRLNKZJU
質問者

お礼

ありがとうございました。