- ベストアンサー
ACCESS ADOのMovePreviousについて
毎度お世話になっております。 ACCESS2003を使用しています。 ACCESS ADOにて、レコードセットがeofになった後、 MovePreviousをし、MoveNextをし、 さらにもう一度MovePreviousをすると、 最終レコードの一つ前に戻ってしまいます。 テーブル1 フィールド1 フィールド2 1 あ 2 い 3 う 4 え 5 お コード Sub test() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.Open "select * from テーブル1 order by フィールド1", cn, adOpenDynamic, adLockReadOnly Do Until rs.EOF rs.MoveNext Loop rs.MovePrevious Debug.Print rs.Fields("フィールド1").Value rs.MoveNext rs.MovePrevious Debug.Print rs.Fields("フィールド1").Value rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub 一度目のdebug.printは5に、 二度目のdebug.printは4になります。 このような仕組みなのでしょうか。 ご教授お願いいたします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
結局、「AccessでadOpenDynamicは使うべきではない」ということなんだと思います。 もともとAccessの場合、Jet/Aceが動的カーソルをサポートしていないので、カーソルタイプは LockType=adReadOnlyのときはadOpenKeysetに、それ以外のときはadOpenStaticに変更される とよくいわれますが、その割にRowCountはとれないことを考えると、結局adOpenKeysetや adOpenStaticとして処理が行われているわけでもなく、意味不明のカーソルになっている と考える方が自然です。 確かにMovePreviousがおかしな動きをしますが、それは仕様だからというよりは、 「動的カーソルをサポートしていない場合の動きを保証していないから」と考えるべきでしょう。
その他の回答 (1)
rs.MoveNext Debug.Print rs.Fields("フィールド1").Value rs.MovePrevious Debug.Print rs.Fields("フィールド1").Value で、どうなるかですね。 「次へ行きなさい」で次に行く準備をしたとします。 で、次に行って何をするかの指令を待機中だとします。 その待機中に「いいや、一つ手前の命令を実行せよ!」との新たな指示が到着。 こういう推測が当を得ているかどうかはテストるのみでしょう。
補足
回答ありがとうございます。 Do Until rs.EOF rs.MoveNext Loop rs.MovePrevious Debug.Print rs.Fields("フィールド1").Value ↑ 5になりました。 rs.MoveNext Debug.Print rs.Fields("フィールド1").Value ↑ エラーになりました。 実行時エラー'3021': BOFとEOFのいずれかがTrueになっているか、または現在の レコードが削除されています。要求された操作には、現在の レコードが必要です。 rs.MoveNextではeofになっているようです。
補足
回答ありがとうございます。 以下の2つでそれぞれテストしてみました。 1.adOpenDynamic, adLockReadOnly 一度目のdebug.printは5 二度目のdebug.printは4 CursorTypeはadOpenStaticになっていました。 2.adOpenStatic, adLockReadOnly 一度目のdebug.printは5 二度目のdebug.printは5 >意味不明のカーソルになっていると考える方が自然です。 ほんと意味不明と感じますが 納得できました。 ありがとうございました。