プロが教える店舗&オフィスのセキュリティ対策術

アクセスADOでクエリの行数を取得したいのですが
クエリが200行でも100行でも必ず12が返ります。

クエリ1は、一度12行の時にadoで数を取得し、その時は、正しく12が返ったのですが、
行数が変わっても12が返ります。

コードは、

Sub Sample()
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Set cn = CurrentProject.Connection

rs.Open "SELECT * FROM クエリ1", cn, adOpenStatic, adLockPessimistic
Debug.Print rs.RecordCount

rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing
End Sub

です。

Debug.Print DCount("*", "クエリ1")

だと、正しいレコード数が取得されるのですが、ADOだとおかしいです。


クエリ1のSQL文は、

SELECT Q_作業用.*
FROM Q_作業用;

のように、別のクエリを持ってきています。

何が原因なのでしょうか?

よろしくお願いします。

A 回答 (2件)

クエリ1に抽出条件があるのでは

「アクセス ADO レコードの件数がおかし」の回答画像2
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/07/23 19:17

クエリの内容が伏せられた状態なので、想像するしかないのですが


再現を含め以下に(違っていたらスルーしてください)

テーブル「★★」が以下の様だと仮定します。
(「an」オートナンバ、「F1」テキスト型)

an  F1
1  ABCD
2  BCDE
3  CDEF
4  DEFG
5  EFGH

クエリ「Q_★★」を以下とした時の表示は、

SELECT an, F1 FROM ★★ WHERE F1 Like '*C*' ORDER BY an;

an  F1
1  ABCD
2  BCDE
3  CDEF

VBA で以下を記述し、最終の i、j の値を確認すると、i = 3、j = 0

Public Sub test()
  Dim rs As New ADODB.Recordset
  Dim i As Long, j As Long

  i = DCount("*", "Q_★★")
  rs.Source = "SELECT * FROM Q_★★;"
  rs.Open , CurrentProject.Connection, adOpenStatic, adLockOptimistic
  j = rs.RecordCount
  rs.Close
  Debug.Print i, j
End Sub

クエリで指定していたワイルドカードは "*"
ADO でのワイルドカードは "%"
ADO でクエリを指定した場合、内容を ADO 解釈する様です。

DAO でも ADO でも、クエリ「Q_★★」を使いたい場合、
(私はやりませんが)内容を以下に変更した「Q_▲▲」を対象にすると

SELECT an, F1 FROM ★★ WHERE (F1 Like '*C*') OR (F1 Like '%C%') ORDER BY an;

Public Sub test2()
  Dim rs As New ADODB.Recordset
  Dim i As Long, j As Long

  i = DCount("*", "Q_▲▲")
  rs.Source = "SELECT * FROM Q_▲▲;"
  rs.Open , CurrentProject.Connection, adOpenStatic, adLockOptimistic
  j = rs.RecordCount
  rs.Close
  Debug.Print i, j
End Sub

最終の i、j の値を確認すると、i = 3、j = 3
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/07/23 19:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています