Microsoft Office 12.0 Access Database Engine OLE DB Provider の接続文字列について

huahi11115 640 評価のポイント
2025-09-11T03:02:36.7+00:00

Microsoft.ACE.OLEDB.12.0 とも呼ばれているようです。

accessruntime_4288-1001_x64_ja-jp.exe をインストールして、実際に使える状態です。

接続文字列「Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\1.mdb」で正常に読み書きできます。

ところが、末尾に;Connect Timeout=10 を付けて接続すると、

複数ステップの OLE DB の操作でエラーが発生しました。各 OLE DB の状態の値を確認してください。作業は終了しませんでした。 というエラーが出ます。

従来、32ビット版のOLE DB Providerでは;Connect Timeout=10を付けても有効でした。

VB.netでのコードは下の通りです。


Using connection As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\1.mdb;Connect Timeout=10")                
	Try                    
		connection.Open()                    
		Console.WriteLine("データベースに接続できました!")                    
		Using adapter As New OleDbDataAdapter(ConnTestSQL, connection) 'test     
                   adapter.Fill(MyDataSet, "dummy")                    
		End Using                    ' ここにクエリの実行やデータ操作のコードを追加します                	
	Catch ex As Exception                    
		Console.WriteLine("接続エラー: " & ex.Message)                
	End Try	
End Using

Microsoft Office 12.0 Access Database Engine OLE DB Providerの仕様をWEBで発見することができないので質問しますが、

* Connect Timeout= キーワードは使えないのですか。

* ほかにタイムアウト時間を設定する方法は無いのですか。

* タイムアウト時間の設定のデフォルトは何秒ですか。

 

プログラムの設計で、接続文字列をできるだけ同じにして、プロバイダーを変更するだけで接続先サーバーを変更できるようにしているのですが、Connect Timeoutのような基本的な動作もインターフェイスとして実装されていないのは、おかしな設計ですね。

御回答をよろしくお願いします。

開発者テクノロジ | VB
開発者テクノロジ | VB

Microsoft が開発した、.NET で使用できるオブジェクト指向のプログラミング言語。

0 件のコメント コメントはありません

1 件の回答

並べ替え方法: 新しい順
  1. gekka 14,551 評価のポイント MVP ボランティア モデレーター
    2025-09-12T09:35:16.1+00:00

    いったいどこからAccessのConnectionStringにConnect Timeoutが使えるという情報を得たのですか?

    32bit,64bitを試してもどちらでも対応してないですよ?
    Windows8の古いエンジンで試しても対応してないですよ?

    OleDbConnectionStringBuilderのプロパティがDataSource,FileName,Providerのような基本的な設定しかないことからもわかるように、そもそもConnectionStringには最低限の決め事しかなく、それ以外はプロバイダが独自に決めていることです。

    たとえばDataSetデザイナなどで接続設定するときのダイアログをみれば、どのような設定があるかを見ることができます。

    20250912_B

    ですから、Connect Timeoutがあるかどうかはプロバイダ次第です。

    Sub Main()
        Const provider As String = "Microsoft.ACE.OLEDB.12.0"
        Const dbpath As String = "D:\1.mdb"
    
        Try
            System.Diagnostics.Debug.WriteLine($"ADODB.Connection")
    
            Dim o = CreateObject("ADODB.Connection")
            o.Open($"Provider={provider};Data Source={dbpath}")
            For Each p In o.Properties
                System.Diagnostics.Debug.WriteLine($"{vbTab}{p.Name}={p.Value}")
            Next
        Catch
        End Try
    
        Try
            System.Diagnostics.Debug.WriteLine($"Access")
    
            Dim access = CreateObject("Access.Application")
            access.Visible = True
            access.OpenCurrentDatabase(dbpath)
            Dim connectionString = CStr(access.CurrentProject.Connection.ConnectionString)
            For Each part In connectionString.Split(";")
                System.Diagnostics.Debug.WriteLine(part)
            Next
            access.Quit()
        Catch
        End Try
    
        Try
            Dim builder As New System.Data.OleDb.OleDbConnectionStringBuilder
            builder.Provider = provider
            builder.DataSource = dbpath
        Catch
        End Try
    End Sub
    

    もともとローカルファイルのデータベースであるAccessのためのプロバイダには、接続タイムアウトという考えがないのでしょう。

    この回答は役に立ちましたか?


お客様の回答

質問作成者は回答に "承認済み"、モデレーターは "推奨" とマークできます。これにより、ユーザーは作成者の問題が回答によって解決したことを把握できます。