みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

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

解決済みの質問

ADOでSeekメッソッドが使えません。

Access 2003 VBA で、ADOを使用してSQL Server 2008 R2 Express のテーブルを参照しています。

Seekメソッドを使いたいのですが、Indexプロパティーを設定すると、
「現在のプロバイダーは Index 機能に必要なインターフェイスをサポートしてません。」
のエラーが発生してしまいます。

SQL Server は初心者です。よろしくお願いいたします。

-以下ソースプログラムです-

Dim con As New ADODB.Connection
Dim rst As New ADODB.Recordset

con.Open "Provider=SQLOLEDB;SERVER=xxxxx;DATABASE=xxxxxx;UID=sa;PWD=xxxxxx;" 'SQL-Serverへ接続

rst.Open "testdata", con, adOpenKeyset, adLockOptimistic, adCmdTableDirect

Debug.Print rst.Supports(adSeek), rst.Supports(adIndex)
’----結果、 false false

rst.Index = "index1"

' ---- 「現在のプロバイダーは Index 機能に必要なインターフェイスをサポートしてません。」のメッセージ

rst.Seek 0, adSeekAfter

投稿日時 - 2011-03-10 17:59:05

QNo.6584357

困ってます

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

> DAO感覚でIndexしてseekすれば高速検索が簡単にできると甘く考えておりました。

そう美味しい話はあまり、ありません。
DAO感覚でやろうするなら、一捻りしてパススルークエリとワークテーブルを使うやり方があります。
最初のクエリ発行の際にある程度の絞り込みが出来るのが前提ですが、ワークテーブル(INDEX作成済み)の全件削除、パススルーのSQL組み立てとこのパススルークエリのデータをワークテーブルに挿入するクエリの実行。
後は、非接続ですが、高速に扱えます。
更新の場合は、別途ADOでもいいので更新・削除・追加クエリを発行することになります。
ただし、非接続なので、他のユーザーが更新していないか、チェックして更新用のSQLを実行することになりますので、ADOのトランザクション機能を使うのがいいかもしれません。

欠点は最初のパススルークエリでのデータ件数が多いと、ネットワーク負荷・DISK負荷が高いのでレスポンスが悪いのと、ワークテーブルの全件削除と挿入を繰り返すのでローカルのACCESSのファイルが肥大化しやすいことです。

投稿日時 - 2011-03-14 00:30:35

お礼

詳細な回答、ありがとうございます。

ご説明を参考に、またストアドなどを勉強しながら作業を進めさせていただきます。

投稿日時 - 2011-03-14 10:31:28

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

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

回答(2)

ANo.1

SQLOLEDBで作成するRECORDSETがIndex、Seekに対応していないためだと思います。

投稿日時 - 2011-03-10 19:58:36

お礼

大震災で被災してしまい、遅れましたが回答ありがとうございます。
つい先ほど、電力復旧いたしました。

DAO感覚でIndexしてseekすれば高速検索が簡単にできると甘く考えておりました。
もう少し勉強します。

それにしても、findメソッドだと激しく遅いです。
万一、SQLOLEDB以外でIndex、Seekに対応するADOプロバイダーをご存知の方がいらっしゃったら教えていただけると助かります。

投稿日時 - 2011-03-13 14:11:56

あなたにオススメの質問