特定のDBに依存しないデータアクセス方法(DbProviderFactories)

C#で特定のDBに依存しないデータアクセスをする場合の実装方法です。

例えば、Oracleに接続する場合はOracleConnectionを使うし、PostgreSqlに接続する場合はNpgSqlを使用すると思いますが、将来的に切り替えたりさまざまなプロジェクトで流用していこうという場合に依存しない書き方が必要になっています。

やり方としては、DbProviderFactoriesとSystem.Data.Common.DbConnectionなどの基本クラスのみを使って実装する方法です。汎用的なデータアクセスライブラリの書き方としてはお勧めの方法だと思います。

まず、事前準備としてapp.configにファクトリー用の設定をいれます。














DbProviderFactoriesの中身がそうです。typeの中身に使用するライブラリのFactoryクラスを指定します。あとは、以下のような感じでアクセスできるようになります。利用するのはSystem.Data.Common以下の基本クラスのみを使ってアクセスします。


using System;
using System.Data;
using System.Data.Common;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
System.Data.Common.DbConnection conn = DbProviderFactories.GetFactory("Npgsql").CreateConnection();
conn.ConnectionString = Properties.Settings.Default.ConnectionString;
conn.Open();

var command = conn.CreateCommand();
command.CommandText = "select current_timestamp";
command.CommandType = CommandType.Text;
command.Prepare();

var reader = command.ExecuteReader();
var table = new DataTable();
table.Load(reader);

conn.Close();

this.Text = table.Rows[0][0].ToString();

}

}
}