プロが教えるわが家の防犯対策術!

Dim con As ADODB.Connection
Dim rsData As ADODB.Recordset
Dim DNSname$,USERname$,PASSw$,cnt&
 Set con = CreateObject("ADODB.Connection")
 con.Open "DSN=" & DNSname & "; UID= " USERname & "; PWD=" & PASSw
 Set rsData = New ADODB.Recordset
 rsData.Open SQL, con
 Do While Not rsData.EOF
  rsData.MoveLast
  cnt=rsData.RecordCount
  rsData.First
 LOOP
といいコードで総レコード数が取得できるかなとやってみたところ、rsData.MoveLastのところで、「行セットは逆フェッチをサポートしていません」というエラーが出ました。
なにかほかの方法で総レコード数を取得する方法があるのでしょうか?
自分で他に試したことは、rsData.EOFまでrsData.MoveNextでもっていきrsData.EOF-1レコードの.RecordCountを取得すしようと試みましたが、最後のレコードまできても.RecordCountは「-1」のまま変化しませんでした。レコードセットの呼び込み方が不味いのでしょうか?

A 回答 (4件)

#2 です。


Set con = CreateObject("ADODB.Connection")
con.CursorLocation = adUseClient
con.Open "DSN=" & DNSname & "; UID= " USERname & "; PWD=" & PASSw
としてみたらどうなりますか?
    • good
    • 2
この回答へのお礼

>con.CursorLocation = adUseClient
の行を追加したら取得できました。
レコードセットのほうになにか設定値があるのかと色々探していましたが、オブジェクトのだったんですね。ありがとうございました。

お礼日時:2007/11/12 21:48

私の作った7件の社員3テーブルにたいし


(質問のコードを少し簡略化してますが)
Sub test02()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim DNSname$, USERname$, PASSw$, cnt&
Set cn = CurrentProject.Connection
Set rs = New ADODB.Recordset
rs.Open "社員3", cn, adOpenKeyset, adLockOptimistic
cnt = rs.RecordCount
MsgBox cnt
rs.MoveFirst
Do Until rs.EOF
MsgBox rs!氏名
rs.MoveNext
Loop
End Sub
で 7 と出ました。
====
rs.Open "社員3", cn, adOpenKeyset, adLockOptimistic
の adOpenKeyset, adLockOptimistic
を質問のように除くと、-1と出てうまくいかない。
ここが原因でしょう。
http://www.accessclub.jp/vbakaisetu/22.html
参照

この回答への補足

>Set cn = CurrentProject.Connection
部分のCurrentProjectで「変数が宣言されていません」とのエラーが出ましたので
Set con = CreateObject("ADODB.Connection")
にしてimogasiさんのコードを実行したところ(adOpenKeyset, adLockOptimisticはつけました)、cnt は「-1」でした。
CurrentProjectとはどのように宣言するのでしょうか?

補足日時:2007/11/11 09:13
    • good
    • 0

 Set rsData = New ADODB.Recordset


 rsData.Open SQL, con, adOpenKeyset
 cnt=rsData.RecordCount
でどうでしょうか?

この回答への補足

bonaronさんのやり方やった場合、cntは「-1」でした。
参照設定で、「Microsoft Active Data Objects 2.8 Library」を使用しているのですが、これが間違いなのでしょうか?

補足日時:2007/11/11 09:02
    • good
    • 0

 con.Open "DSN=" & DNSname & "; UID= " USERname & "; PWD=" & PASSw


 Set rsData = con.Execute("SELECT COUNT(*) FROM " & TableName)
 MsgBox rsData.Fields(0).Value

のようにSQLで求められませんか? テストしたのはmdbでOracleでは試していませんが…

TableNameのところは置き換えてください

この回答への補足

rsData.Open SQL, conを無効にして
>Set rsData = con.Execute(
でも接続できレコードセットは取得できました。
しかし
>MsgBox rsData.Fields(0).Value
では、そのフィールドの内容が出るだけでレコード総数は求められませんでした。

補足日時:2007/11/11 08:59
    • good
    • 0

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

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


このQ&Aを見た人がよく見るQ&A