単にSeekメソッドがサポートされない状況(サポートしていないプロバイダや、サポートしていないカーソルのタイプ)でSeekメソッドを使用したためエラーが発生しているのではないでしょうか?
このサンプルソースの
If rstEmployees.Supports(adIndex) And rstEmployees.Supports(adSeek) Then
のようにレコードセットがSeekメソッドをサポートしていることを確認してから使用したら良いのではないでしょうか?
Seekメソッド自体が重い処理になると思うのでDBのサイズが大きいならタイムアウトになっているのかなと思いました。ConnectionTimeoutを0にすればタイムアウトにはならなくなります。ただ、タイムアウトの場合はエラーが発生していたと思ったのでちょっと違うかも知れません。
そもそもSeekメソッドが安定して動かないならSeekメソッドを使わずに最初にRecordsetを開く際のSQLにSeekで検索していた値をWHERE句の条件に追加して対象レコードを絞った方が確実だと思います。Recordsetのサイズも小さくなって効率もよくなる場合もあると思いますし。
ローカルMDBファイルを、TableDirectで開いています.
SQLでSELECT WHEREするよりも、Seekメソッドを使ったほうが高速だったためSeekを使っています。
タイムアウトは考えにくいです。Seekは1秒もかからず瞬時に終わります。
Seekが失敗するという現象と、どのような時におこるのかという情報を探しています。回避策もあればなお良し。
英文可。BBSやMLのログでもかまいません。
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 と試しましたが同じです。
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のサンプルコードですらそのようなことはしていないので、いまいち腑に落ちなかったりもします。
ですが、とても助かりました。とりあえず、結果オーライです。ありがとうございました。
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を使っている為でしょうか?