• ベストアンサー

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になります。 このような仕組みなのでしょうか。 ご教授お願いいたします。

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

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.2

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

tokonoko
質問者

補足

回答ありがとうございます。 以下の2つでそれぞれテストしてみました。 1.adOpenDynamic, adLockReadOnly 一度目のdebug.printは5 二度目のdebug.printは4 CursorTypeはadOpenStaticになっていました。 2.adOpenStatic, adLockReadOnly 一度目のdebug.printは5 二度目のdebug.printは5 >意味不明のカーソルになっていると考える方が自然です。 ほんと意味不明と感じますが 納得できました。 ありがとうございました。

その他の回答 (1)

noname#140971
noname#140971
回答No.1

  rs.MoveNext   Debug.Print rs.Fields("フィールド1").Value   rs.MovePrevious   Debug.Print rs.Fields("フィールド1").Value で、どうなるかですね。 「次へ行きなさい」で次に行く準備をしたとします。 で、次に行って何をするかの指令を待機中だとします。 その待機中に「いいや、一つ手前の命令を実行せよ!」との新たな指示が到着。 こういう推測が当を得ているかどうかはテストるのみでしょう。

tokonoko
質問者

補足

回答ありがとうございます。   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になっているようです。   

関連するQ&A