人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: kiichigo
●カテゴリ:コンピュータ
✍キーワード:ActiveX カレント カーソル メソッド レコード
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● space
●10ポイント

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メソッドをサポートしていることを確認してから使用したら良いのではないでしょうか?

◎質問者からの返答

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を使っている為でしょうか?


2 ● space
●10ポイント

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

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

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

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

◎質問者からの返答

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

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

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

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

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


3 ● Wing_hack
●10ポイント

http://www.microsoft.com/downloads/details.aspx?FamilyID=6c050fe...

ダウンロードの詳細 : MDAC 2.8

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

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

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

◎質問者からの返答

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

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


4 ● kn1967
●150ポイント

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

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

URLはダミーです。

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

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

◎質問者からの返答

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

ありがとうございます。

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

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ