プロが教えるわが家の防犯対策術!

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

A 回答 (2件)

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



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

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

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

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

お礼日時:2011/03/14 10:31

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

    • good
    • 0
この回答へのお礼

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

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

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

お礼日時:2011/03/13 14:11

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す