いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

ADO.NET入門記-016 (データプロバイダファクトリの手動追加について)(machine.config, app.config, system.data, DbProviderFactories)


ADO.NETにてDbProviderFactoryオブジェクトを用いて、処理を行なう場合、まずDbProviderFactoriesから
該当するInvariantNameを持つデータプロバイダファクトリオブジェクトを取得します。


コードでいうと以下のような感じです。(オラクル用のデータプロバイダファクトリを取得する場合)

DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.OracleClient");


この設定は、通常.NET Frameworkのディレクトリ以下のCONFIG/machine.configに設定されています。
(通常だと、このディレクトリはc:/windows/microsoft.NET/Framework/v2.xxxxxとかになります。)


machine.configの中に、DbProviderFactoriesというタグがあり、その中に利用できるデータプロバイダファクトリの
設定が記述されています。
この場所に記述されているデータプロバイダファクトリは、グローバルに有効になります。
つまり、どこからでも利用できるデータプロバイダファクトリとなります。


でも、時には自分のアプリの中だけで利用したいデータプロバイダファクトリもあります。
また、理由によりmachine.configを書き換えることが許されない環境もあるでしょう。


そういう場合には、アプリケーション構成ファイルの中に定義することが出来ます。
(windows formsの場合はApp.configとなります。)


以下のようにしてApp.config内に定義します。
(以下はPostgreSQL用のデータプロバイダーであるNpgsqlの設定を行なっています。)

  <system.data>
    <DbProviderFactories>
      <add name="Npgsql Data Provider" invariant="Npgsql" description=".Net Framework Data Provider for PostgreSQL" type="Npgsql.NpgsqlFactory, Npgsql, Version=1.98.2.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7" />
    </DbProviderFactories>
  </system.data>


これをconfigSectionsの下に定義しておくと自動的に読み込まれます。


確認方法はアプリケーションを動かした時に

DbProviderFactories.GetFactoryClasses()

メソッドを呼び、追加した名前が存在していればオッケイです。