いろいろ備忘録日記

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

DbProviderFactoryを用いてのデータベース接続の確立(System.Data.Common.DbProviderFactory, machine.config)


ADO.NET2.0から、DbProviderFactoryクラスが追加され、それに伴い
各接続型オブジェクトがファクトリメソッド経由で生成できるようになっています。


DbProviderFactoryオブジェクトは、DbProviderFactoriesクラスからGetFactoryメソッド経由で
取得するようになっています。その際、GetFactoryメソッドには、どのファクトリを生成するのかを
指定するようになっています。それが、プロバイダー名となっていまして予め以下の場所にて
登録されています。

%WINDIR%\Microsoft.NET\Framework\バージョン\CONFIG\machine.config

上記のファイルの中に、以下のような部分があります。

  
    
      
      
      
      
      
      
    
  

GetFactoryメソッドには、上記の各XML要素のinvariant属性の名前を渡し、存在している場合はそのファクトリメソッドが返されます。


以下に、SqlServerの場合の例を記述します。
データベースは、以下のように作成されているとします。

  • データソース
    • localhost\SQLEXPRESS
  • イニシャルカタログ
    • adonet_sample_db
  • 認証方法
    • Windows認証
using System;
using System.Data;
using System.Data.Common;

using NUnit.Framework;

namespace Gsf.Samples.AdoNet{
    
    [TestFixture()]
    public class AdoSample002{

        [Test()]
        public void TestCreateConnectionAndOpenConnection(){
            //
            // SqlServer用のファクトリオブジェクトを取得.
            //
            DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.SqlClient");

            //
            // 接続の作成および確立
            //
            using(DbConnection conn = factory.CreateConnection()){
                //
                // 接続文字列作成
                //
                DbConnectionStringBuilder builder = factory.CreateConnectionStringBuilder();
                builder.Add("Data Source",         "localhost\\SQLEXPRESS");
                builder.Add("Initial Catalog",     "adonet_sample_db");
                builder.Add("Integrated Security", "True");

                //
                // 接続確立
                //
                conn.ConnectionString = builder.ConnectionString;
                conn.Open();

                Assert.AreEquals(ConnectionState.Open, conn.State);
            }
        }
    }
}


コードの先頭のusingの部分にて、System.Data.SqlClient名前空間をインポートしていない事に注意してください。
オブジェクトの生成処理をファクトリにまかせているので、後は基礎抽象クラス達(DbConnection)などとして利用すれば
ある程度の汎用化ができるようになります。



================================
過去の記事については、以下のページからご参照下さい。