ADO (ActiveX Data Objects) 2.6 Library の Recordset.Seek メソッドが失敗し、関係のないレコードにカレントカーソルが移動してしまう現象の回避方法

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:--
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答4件)

id:space No.1

回答回数9ベストアンサー獲得回数0

ポイント10pt

http://www.microsoft.com/japan/msdn/library/default.asp?url=/jap...

ご指定のページが見つかりません

単にSeekメソッドがサポートされない状況(サポートしていないプロバイダや、サポートしていないカーソルのタイプ)でSeekメソッドを使用したためエラーが発生しているのではないでしょうか?

http://www.microsoft.com/japan/msdn/library/default.asp?url=/jap...

ご指定のページが見つかりません

このサンプルソースの

If rstEmployees.Supports(adIndex) And rstEmployees.Supports(adSeek) Then

のようにレコードセットがSeekメソッドをサポートしていることを確認してから使用したら良いのではないでしょうか?

id:kiichigo

Do

rs.Seek Values

If rs.EOF Or rs.BOF Then

Exit Do

End If

IsOk = True

For i = 0 To UBound(Fields)

If rs(Fields(i)) <> Values(i) Then

IsOk = False

Exit For

End If

Next i

If IsOk Then

Exit Do

End If

c = c + 1

Loop while c < 10

苦肉の策でこう回避しています。2度目で成功します。一度目だけ、エラーも発生させずにEOFにもならずに関係のないレコードへ行ってしまいます。

If rstEmployees.Supports(adIndex) And rstEmployees.Supports(adSeek) Then

でチェックも一応してみましたが、このチェックに通ったすぐ後でも、Seekは失敗しています。

2度目で大体成功します。

失敗する確立は低いですが、大きなMDBを使っている為でしょうか?

2003/12/16 17:52:17
id:space No.2

回答回数9ベストアンサー獲得回数0

ポイント10pt

http://www.microsoft.com/japan/msdn/library/default.asp?url=/jap...

ご指定のページが見つかりません

Seekメソッド自体が重い処理になると思うのでDBのサイズが大きいならタイムアウトになっているのかなと思いました。ConnectionTimeoutを0にすればタイムアウトにはならなくなります。ただ、タイムアウトの場合はエラーが発生していたと思ったのでちょっと違うかも知れません。

そもそもSeekメソッドが安定して動かないならSeekメソッドを使わずに最初にRecordsetを開く際のSQLにSeekで検索していた値をWHERE句の条件に追加して対象レコードを絞った方が確実だと思います。Recordsetのサイズも小さくなって効率もよくなる場合もあると思いますし。

id:kiichigo

ローカルMDBファイルを、TableDirectで開いています.

SQLでSELECT WHEREするよりも、Seekメソッドを使ったほうが高速だったためSeekを使っています。

タイムアウトは考えにくいです。Seekは1秒もかからず瞬時に終わります。

Seekが失敗するという現象と、どのような時におこるのかという情報を探しています。回避策もあればなお良し。

英文可。BBSやMLのログでもかまいません。

2003/12/17 09:28:12
id:Wing_hack No.3

回答回数3ベストアンサー獲得回数0

ポイント10pt

私はADOを利用してのDBシステムを開発しています。

マイクロソフトの製品を利用するに当たりADO関連で思いもよらない動作があった場合、MDAC(Microsoft Data Access Control)をアップデートすることによりほとんどの動作が正常になりました。

MDACのアップデートをなさっていないようでしたら、一度アップデートしてみて同様の現象が起きるか確認してみてはいかがでしょうか?

id:kiichigo

MDAC 2.8 がインストールされている状態でおきています。

参照設定は、2.1 2.5 2.6 2.7 と試しましたが同じです。

2003/12/24 15:55:20
id:kn1967 No.4

回答回数2915ベストアンサー獲得回数301

ポイント150pt

http://www.hatena.ne.jp/1071556989#

ADO (ActiveX Data Objects) 2.6 Library の Recordset.Seek メソッドが失敗し、関係のないレコードにカレントカーソルが移動してしまう現象の回避方法.. - 人力検索はてな

URLはダミーです。

レコードセットをオープンした直後はカレントレコードがNullのためにまともに動きません。

MoveFirstやMoveLastなどでカレントレコードを設定してからseekしてみてください。

id:kiichigo

かならずMoveFirstするようにしたら、誤った結果を返すことがなくなりました。

ありがとうございます。

どこかにそのことが明文化されていればより安心できるのですが

http://www.microsoft.com/japan/msdn/data/techmat/ado/dao2ado...

MSのサンプルコードですらそのようなことはしていないので、いまいち腑に落ちなかったりもします。

ですが、とても助かりました。とりあえず、結果オーライです。ありがとうございました。

2004/01/06 14:01:52

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません