質問です。
RecordsetオブジェクトのSeekメソットを使って検索を行いたいのですが。
現在のプロバイダはMicrosoft.Jet.OLEDB.4.0;なのですが
Supports(adSeek)メソットでSeekメソットが使用できるか確認したところ
Falseが帰ってきました。
Microsoft.Jet.OLEDB.4.0;ではSeekは使用できないのですか?
> Microsoft.Jet.OLEDB.4.0;ではSeekは使用できないのですか?
adCmdTableDirectモードで開かれたRecordsetなら、使用できますよ。
(Seekをサポートしているのは、Jet Providerぐらいしか無かったりします)
なお、Supportsメソッドの結果は、CommandTextの内容や、指定した
CursorLocation, CursorType, LockType等によって変化します。
詳細は、ヘルプ(MDAC SDK)で確認してみてください。
すいません、
adCmdTableDirectモードととは、どのプロパティにあたるのですか?
> adCmdTableDirectモードととは、どのプロパティにあたるのですか?
Recordset.Open時の最後の引数です。
ところで。
一般的には「メソット」ではなく、「メソッド(Method)」と記載します。
ヘルプでも、「メソッド」と書かれていますよね。
そうですね。メソット->メソッドですね。
Dim RS As New ADODB.Recordset
Dim strSQL AS string
strSQL = "SELECT * FROM add"
RS.CursorLocation = adUseClient
RS.CursorType = adOpenDynamic
RS.LockType = adLockOptimistic
RS.Open strSQL, Cn, , , adCmdTableDirect
Set DataGrid1.DataSource = RS.DataSource
x = RS.Supports(adSeek)
すいません↑のやり方だとSeekがサポートできません。。。。
なにが悪いんでしょうか?
ADOのヘルプ(MDAC SDK)で、各プロパティの意味を確認しておいて下さいね。
ヘルプを良く読めば、そのコードでは、Seekが使えないことがわかるかと思いますよ。
最大の問題点は、『adUseClientモードでは、Seekメソッドがサポートされない』事です。
これはヘルプの「Seek メソッド」の項に書いてあります。
また、adCmdTableDirectオプションを使うときは、SELECTクエリではなく、テーブル名だけを指定する必要があります。
つまり、strSQL = "SELECT * FROM add"ではなく、strSQL="add"ですね。
さて。ここまで修正したとして、もう一つ問題が残っています。
それは、『Jetプロバイダは、adOpenDynamicをサポートしていない』事です。
ここはとりあえず、adOpenKeysetあたりが妥当でしょう。
最後に、もう一つだけ覚えておいて欲しい事があります。
それは、adUseClientモードで接続している場合は、
adOpenStaticタイプしか利用できないという事です。
# どうしてadOpenStaticしか使えないのか、という理由は、
# CursorLocationプロパティの動作や、各CursorType定数の
# 意味を理解するとわかってくるのですが、とりあえず今は、
# adUseClientではadOpenStaticのみ、と覚えておけば良いかと。
なお、データの検索には、Seekの他にFilterプロパティやFindメソッドなども
利用できますので、Seekが使えない場合は、こちらで代用してみて下さい。
魔界の仮面弁士 様 詳しい説明ありがとうございました。
プロパティを設定し直したら無事動作しました。