泥庭

2012年3月1日

データプロバイダに依存しない実装

Filed under: .NET, DB — タグ: — yone64 @ 12:26 AM

またまた、前回から間が空いてしまいました。もう少し頻繁に記事を書きたいですね。幸い、今までの職場での勤務が終了し、次のお仕事が始まるまでしばらく時間があるので、しばらくは、これまでにかかわってきたプロジェクトでやったことを思い出しながら書いてみようと思います。

さて、世間的にはどの程度需要があるのかわかりませんが、私がこれまでかかわってきたプロジェクトでは、マルチDBMSを要求されることが多くありました。よくあるパターンはSQLServerとMSAccessで、他にはOracleとFirebirdという組み合わせもありました。

.NET FrameworkからこれらのDBに接続する場合は、それぞれに準備された専用のクラスを使用する必要があります。例えば、SQLServerならSystem.Data.SqlClient名前空間下の「SqlConnection」「SqlCommand」「SqlDataAdapter」等、MSAccessならSystem.Data.OleDb名前空間下の「OleDbConnection」「OleDbCommand」「OleDbDataAdapter」等といった感じです。

.NET Framework 2.0以降では、これらのクラスを作成するDbProviderFactoryというクラスが用意されており、これを用いることでデータプロバイダに依存しない実装が可能となります。

ConnectionStringSettings css = ConfigurationManager.ConnectionStrings["MyConnection"];
DbProviderFactory factory = DbProviderFactories.GetFactory(css.ProviderName);

DbConnectionStringBuilder sb = factory.CreateConnectionStringBuilder();
sb.ConnectionString = css.ConnectionString;

using (DbConnection connection = factory.CreateConnection())
{
    connection.ConnectionString = sb.ConnectionString;
    connection.Open();
    //factory.CreateCommand()でもいいけど、こっちの方が素直な気がする。
    DbCommand command = connection.CreateCommand();

    //ここはDBに依存することが多い。
    command.CommandText = "SELECT * FROM TABLE1 WHERE ID = ?";
    DbParameter p = factory.CreateParameter();
    p.DbType = DbType.Int32;
    p.Value = 1;
    command.Parameters.Add(p);

    using (DbDataReader reader = command.ExecuteReader())
    {
        while (reader.Read())
        {
            reader.GetInt32(0);
        }
    }
}

コメントする »

まだコメントはありません。

RSS feed for comments on this post. TrackBack URI

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

WordPress.com で無料サイトやブログを作成.

%d人のブロガーが「いいね」をつけました。