ADOでSeekメソッドが利用できません

このQ&Aのポイント
  • Access 2003 VBAでADOを使用してSQL Server 2008 R2 Expressのテーブルを参照していますが、Seekメソッドを利用することができません。
  • "現在のプロバイダーは Index 機能に必要なインターフェイスをサポートしていません"というエラーが発生しています。
  • 詳細な原因は分かりませんが、SQL Serverの初心者ですので、解決方法を教えていただけると助かります。
回答を見る
  • ベストアンサー

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

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

  • ベストアンサー
  • nora1962
  • ベストアンサー率60% (431/717)
回答No.2

> DAO感覚でIndexしてseekすれば高速検索が簡単にできると甘く考えておりました。 そう美味しい話はあまり、ありません。 DAO感覚でやろうするなら、一捻りしてパススルークエリとワークテーブルを使うやり方があります。 最初のクエリ発行の際にある程度の絞り込みが出来るのが前提ですが、ワークテーブル(INDEX作成済み)の全件削除、パススルーのSQL組み立てとこのパススルークエリのデータをワークテーブルに挿入するクエリの実行。 後は、非接続ですが、高速に扱えます。 更新の場合は、別途ADOでもいいので更新・削除・追加クエリを発行することになります。 ただし、非接続なので、他のユーザーが更新していないか、チェックして更新用のSQLを実行することになりますので、ADOのトランザクション機能を使うのがいいかもしれません。 欠点は最初のパススルークエリでのデータ件数が多いと、ネットワーク負荷・DISK負荷が高いのでレスポンスが悪いのと、ワークテーブルの全件削除と挿入を繰り返すのでローカルのACCESSのファイルが肥大化しやすいことです。

kazz-voice
質問者

お礼

詳細な回答、ありがとうございます。 ご説明を参考に、またストアドなどを勉強しながら作業を進めさせていただきます。

その他の回答 (1)

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

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

kazz-voice
質問者

お礼

大震災で被災してしまい、遅れましたが回答ありがとうございます。 つい先ほど、電力復旧いたしました。 DAO感覚でIndexしてseekすれば高速検索が簡単にできると甘く考えておりました。 もう少し勉強します。 それにしても、findメソッドだと激しく遅いです。 万一、SQLOLEDB以外でIndex、Seekに対応するADOプロバイダーをご存知の方がいらっしゃったら教えていただけると助かります。

関連するQ&A

  • VBAからaccessへの接続で、RecordsetのCursorTypeが勝手に変更される

    エクセルVBAからaccessへの接続で、RecordsetのCursorTypeが勝手に変更されてしまいます。 Dim rst As New ADODB.Recordset rst.CursorType = adOpenStatic と「adOpenStatic」に設定したいのですが、 Set rst = con.Execute(sql_str, , adCmdText) のようにクエリを実行した直後にCursorTypeを調べると、「adOpenForwardOnly」に変わってしまっています。 (設定直後に調べると、ちゃんとadOpenStaticになっています) 「CursorType」を何に設定しても、Execute直後に「adOpenForwardOnly」になってしまっていまうようです。 CursorTypeをadOpenStaticにして、RecordCountを使いたいのですが、、、 CursorTypeが変わってしまう原因をお知りの方は、教えていただけるとありがたいです。 Dim rst As New ADODB.Recordset Dim con As New ADODB.Connection con.Open "Provider=Microsoft.jet.OLEDB.4.0;" & "Data Source=" & ThisWorkbook.Path & "\" & mdb_file & ";" rst.CursorType = adOpenStatic rst.LockType = adLockReadOnly MsgBox "前 = " & rst.CursorType Set rst = con.Execute(sql_str, , adCmdText) MsgBox "後 = " & rst.CursorType

  • ADOを使いDBへ読み書きしたい

    VB初心者です。よろしくお願いします。 今、VBのActiveXドキュメントを使い、ブラウザ上で利用できるシステムを作ろうと思っています。その際、Textboxに入力されたデータをADOを使いAccess2003に格納したいのですが、うまくいきません。DAOではうまくいきました。 コードは以下の通りです。 Private Sub Command1_Click() Dim db As ADODB.Connection Dim rst1 As ADODB.Recordset Set db = New ADODB.Connection db.ConnectionString= "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source = 'データへのパス'\zaseki3.mdb" db.Open MsgBox ("接続成功") Set rst1 = New ADODB.Recordset ☆☆rst1.Open "T-利用者", db,adOpenForwardOnly,adLockOptimistic   With rst1 .AddNew .Fields("氏名") = Text1 .Update End With rst1.Close db.Close Set db = Nothing Set rst1 = Nothing End Sub ☆☆のところでエラーが発生します。エラー内容は次の通りです。  実行時エラー'-2147217900(80040e14)': SQLステートメントが正しくありません。'DELETE'などを使用してく ださい。 環境は Windows XP, VB6.0, Access2003  です。 よろしくお願いします。

  • vb ado → vb2005 ado.net変換

    お世話になります。初めて投稿させていただきます。 VB6.0で下記のようなコードでコンボボックスcboMakerへフィールド値を格納しているのですがこのコードをVB2005のado.netで記述したいのですが可能でしょうか?可能であればどのようなコードを書けばよいのでしょうか。フィールドの値を1レコードづつ取得することは可能なのでしょうか? 初心者ですみません。宜しくお願いします。 Dim con As ADODB.Connection Dim rec As ADODB.Recordset Dim sql As String Dim recCnt As Long con = New ADODB.Connection con.ConnectionString "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & パス con.Open() rec = New ADODB.Recordset sql = "SELECT * FROM " & テーブル名 rec.Open(sql, con, adOpenStatic, adLockReadOnly) If rec.RecordCount < 1 Then 'レコードが存在しない MsgBox("未登録です。", G_MB_CAUTION, G_SYSTEM_NAME) Exit Function Else ReDim CboMakerId(rec.RecordCount) End If 'コンボボックスに値を挿入 ※「.List(recCnt)」から値を挿入する With Me.cboMaker .Clear() recCnt = 0 .List(recCnt) = "" .ItemData(recCnt) = 0 Do Until rec.EOF recCnt = recCnt + 1 .List(recCnt) = rec("Name") .ItemData(recCnt) = rec("ID") rec.MoveNext() Loop End With Me.cboMaker.ListIndex = 0 rec.Close() : rec = Nothing con.Close() : rec = Nothing End Function

  • ADO1とADO2は意味は同じですか?

    Private Sub ADO1() Dim cn As New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= " & CurrentProject.FullName cn.Close: Set cn = Nothing End Sub Private Sub ADO2() Dim cn As ADODB.Connection Set cn = New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= " & CurrentProject.FullName cn.Close: Set cn = Nothing End Sub は、 Dim cn As ADODB.Connection Set cn = New ADODB.Connection を簡素化したものが Dim cn As New ADODB.Connection になるのでしょうか?

  • ORACLE9iをVB6のADOで更新できません

    こんにちは、ats8181oyajiです VBのカテゴリでも先週同じ質問をしたのですが 回答がありませんでしたので、削除してカテゴリ変更いたしました Set OraSession = CreateObject("OracleInProcServer.XOraSession") Set OraDatabase = OraSession.DbOpenDatabase(OraNet, OraUser & "/" & OraPass, 0&) ' &H2& でオブジェクトで操作する方法はうまく行くのですが Dim cnn As New ADODB.Connection Dim SQLSTR As String cnn.Open "Provider=MSDAORA;" & _ "Data Source=XXXXXXX;", "UID", "PASSWORD" Dim rst As New ADODB.Recordset SQLSTR = "select * from AAAAAA where キー=1" rst.Open SQLSTR, cnn, _ adOpenKeyset, adLockOptimistic If rst.EOF Or rst.BOF Then Exit Function End If '* rst!koumoku = 0 '* rst.Update のようにADOを使うと*の命令文の処理で"エラー3251 オブジェクトまたはプロバイダは要求された操作を実行 できませんでした"となります。 でも不思議なことに、レコードセットのオープンはできていて セレクトした内容も読めています オラクルが9iだと"Provider=MSDAORA"だとダメなのでしょうか? 情報をご存知の方がおられましたら よろしくお願いいたします。

  • アクセス2000(ADO)のレコード更新について

    1件しかレコードがない[リスト連番T]テーブルのレコードを読みだして、(フィールド)リストNOをプラス1して更新したいです。 DOAが混ざっているのか、下記のようにエラーがでます。プラス1して更新する正しいプログラムを教えて下さい。 Private Sub リスト_Click() Dim DBS As Databasu Dim CNC As New ADODB.Connection Dim RST As New ADODB.Recordset Dim LISTNO As Intejer Set CNC = CurrentProject.Connection RST.Open "リスト連番T", CNC, adOpenKeyset,adLockOptimistic, adCmdTableDirect LISTNO = RST!リストNO RST.Close Set RST = Nothing CNC.Close Set CNC = Nothing Set DBS = CurrentDb Set RST = DBS.OpenRecordset("リスト連番T") With RST -----.Edit で コンパイルエラー-----   メソッドまたはデータメンバーがみつかりません .Edit !リストNO = LISTNO + 1 .Update .Close

  • ADO 「NEW」の意味、必要性

    ADOを使ってACCESSやSQLサーバーへ接続する時に Option Explicit Sub ADO() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset cn.Open "Provider=SQLOLEDB;Data Source=○○○\SQLEXPRESS;Initial Catalog=test;Integrated Security=SSPI" rs.Open "table1", cn, adOpenStatic, adLockOptimistic というようなコードを書きますが、 変数の宣言の「 New 」はどういう意味なのでしょうか? 何のためにつけるのでしょうか? あえて「 New 」を取ると、 「オブジェクト変数または With ブロック変数が設定されていません。」 というエラーになります。 普通の変数(Dim table名 As String)に 「 New 」を付けるとコンパイルエラーになります。 違いがわかりません。 よろしくお願いします。

  • ADOを使用してExcelファイルをオープンし、内部結合したい。

    エクセルに2つのシートがあります。 シート名"男性用","女性用" それぞれのシートに"名前"の列があります。 この2つのシートを内部結合して検索したいのですが 可能でしょうか ----------------------シート1個の場合 Dim cn As ADODB.Connection Set cn = New ADODB.Connection cn.Provider = "Microsoft.Jet.OLEDB.4.0" cn.Properties("Extended Properties") = "Excel 8.0" cn.Properties("Data Source") = App.Path & "\test.xls" cn.Open Dim cmd As ADODB.Command Set rst = New ADODB.Recordset rst.Source = "Select * From [男性用$]" rst.ActiveConnection = cn rst.CursorType = adOpenDynamic rst.Open , , , , adCmdText '------------------------------ これで取り出せますがシート2つを内部結合させたいばあい rst.Source = "Select * From [男性用$]" はどう変えたらいいでしょうか excelでなければ select * from 男性用 inner join 女性用 on 男性用.名前=女性用.名前 となると思いますが。

  • ADOでエクセルからSQL Serverへデータを移行するには

    エクセルvbaのADOを使って、 SQL Serverの「test」という名のデータベースの「Table_1」に 新規レコードを追加する事はできますか? エクセルからアクセスには Sub test() Dim データベース名 As String Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection Set rs = New ADODB.Recordset cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & データベース名 rs.Open "Tテーブル1", cn, adOpenKeyset, adLockOptimistic rs.AddNew rs.Fields("フィールド1") = データ rs.Update rs.Close cn.Close Set rs = Nothing Set cn = Nothing End Sub で移行しています。 これをエクセルからSQL Serverへ移行させるにはどうすればいいのでしょうか? よろしくお願いします。

  • ExcelでADOを使って他のブックを参照したい

    いつも楽しく勉強させていただいております。 VBA関連のサイトを参照して同じブックにあるシートをADOを使って参照することに成功しました。 Dim CN As New ADODB.Connection Dim RS As New ADODB.Recordset Dim SQL As String Set CN = New ADODB.Connection CN.Provider = "Microsoft.Jet.OLEDB.4.0" CN.Properties("Extended Properties") = "Excel 8.0" CN.Open ThisWorkbook.FullName SQL = "SELECT * FROM [userlist$]" RS.Open SQL, CN, adOpenStatic, adLockReadOnly Do Until RS.EOF Debug.Print RS![P-1] RS.MoveNext Loop RS.Close CN.Close これを現在開いている別のブック、たとえばBook1にあるシートを参照するにはどこをどう書き換えたらいいでしょうか。