こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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になります。

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

投稿日時 - 2008-11-06 17:33:58

QNo.4458188

暇なときに回答ください

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

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

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

投稿日時 - 2008-11-07 00:37:54

補足

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

以下の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:51

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

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

で、どうなるかですね。

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

こういう推測が当を得ているかどうかはテストるのみでしょう。

投稿日時 - 2008-11-06 19:04:30

補足

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

  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:50

あなたにオススメの質問