• ベストアンサー
  • 暇なときにでも

ACCESS ADOのMovePreviousについて

  • 質問No.4458188
  • 閲覧数761
  • ありがとう数1
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 53% (21/39)

毎度お世話になっております。
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になります。

このような仕組みなのでしょうか。
ご教授お願いいたします。

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

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

ベストアンサー率 88% (591/669)

結局、「AccessでadOpenDynamicは使うべきではない」ということなんだと思います。

もともとAccessの場合、Jet/Aceが動的カーソルをサポートしていないので、カーソルタイプは
LockType=adReadOnlyのときはadOpenKeysetに、それ以外のときはadOpenStaticに変更される
とよくいわれますが、その割にRowCountはとれないことを考えると、結局adOpenKeysetや
adOpenStaticとして処理が行われているわけでもなく、意味不明のカーソルになっている
と考える方が自然です。
確かにMovePreviousがおかしな動きをしますが、それは仕様だからというよりは、
「動的カーソルをサポートしていない場合の動きを保証していないから」と考えるべきでしょう。
補足コメント
tokonoko

お礼率 53% (21/39)

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

以下の2つでそれぞれテストしてみました。
1.adOpenDynamic, adLockReadOnly
一度目のdebug.printは5
二度目のdebug.printは4
CursorTypeはadOpenStaticになっていました。

2.adOpenStatic, adLockReadOnly
一度目のdebug.printは5
二度目のdebug.printは5

>意味不明のカーソルになっていると考える方が自然です。
ほんと意味不明と感じますが
納得できました。

ありがとうございました。
投稿日時:2008/11/07 08:44

その他の回答 (全1件)

  • 回答No.1
  rs.MoveNext
  Debug.Print rs.Fields("フィールド1").Value
  rs.MovePrevious
  Debug.Print rs.Fields("フィールド1").Value

で、どうなるかですね。

「次へ行きなさい」で次に行く準備をしたとします。
で、次に行って何をするかの指令を待機中だとします。
その待機中に「いいや、一つ手前の命令を実行せよ!」との新たな指示が到着。

こういう推測が当を得ているかどうかはテストるのみでしょう。
補足コメント
tokonoko

お礼率 53% (21/39)

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

  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になっているようです。
  
投稿日時:2008/11/07 08:09
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,600万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ