更新日: 2006 年 2 月 1 日

このコンテンツのポイント

  • プロバイダ ファクトリの利用方法を理解する。

今回紹介するコード

<Form1.cs>

C#
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.Common;

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

        private void button1_Click(object sender, EventArgs e)
        {
            // プロバイダファクトリ作成
            DbProviderFactory fact = DbProviderFactories.GetFactory(textBox1.Text);

            // ファクトリにて DbConnecion へ固有プロバイダのインスタンス化
            using (DbConnection cnn = fact.CreateConnection())
            {
                cnn.ConnectionString = textBox2.Text;
                cnn.Open();

                // ファクトリにて DbCommand へ固有プロバイダのインスタンス化
                DbCommand cmd = fact.CreateCommand();
                cmd.Connection = cnn;
                cmd.CommandText = "SELECT COUNT(*) FROM Production.Product";
                MessageBox.Show(cnn.ToString() + " / " + cmd.ToString());
                MessageBox.Show("行数 = " + cmd.ExecuteScalar().ToString());
            }
        }
    }
}
 

目次

はじめに
作成するアプリケーションの概要
Windows フォームのデザイン
プロバイダ ファクトリを利用するコードの実装
動作と解説
おわりに

Visual Basic の内容はこちらに掲載しています。
10 行でズバリ !! プロバイダ ファクトリの利用 (VB)

 


はじめに

ADO.NET 2.0 では、汎用的なプログラミングを行うために、プロバイダ ファクトリおよびプロバイダ基本クラスが導入されています。

基本クラスとプロバイダ ファクトリを組み合わせて使用することにより、今まで以上に特定のデータ プロバイダに依存しないプログラミングを行うことが出来ます。

今回の 10 行シリーズでは、プロバイダ ファクトリによる基本クラスを使用する方法について、簡単なサンプル アプリケーションを通じて解説します。

作成するアプリケーションの概要

今回は、基本クラスおよびプロバイダ ファクトリを使用し、データ アクセスを行う Windows アプリケーションを作成します。

プロバイダ ファクトリにて基本クラス (DbConnection / DbCommand) へ固有プロバイダのインスタンス化を実施し、サンプル データの行数を取得します。

なお、データベースとしては SQL Server 2005 に付属の 「AdventureWorks」 サンプル データベースを使用します。(SQL Server 2005 Express Edition を使用している場合は、ダウンロードセンタ / SQL Server 2005 Express Edition ドキュメントとサンプル より別途入手します。)

Windows フォームのデザイン

Visual Studio 2005 を起動して、新規にプロジェクトを作成します。

ここでは、 [Visual C#] - [Windows アプリケーション] テンプレートを使用し、プロジェクト名 “FactSample” にてプロジェクトを作成します。

図 1. Windows アプリケーションの作成

自動で生成された Windows フォーム (“Form1.cs”) に TextBox コントロールを 2 つと、Button コントロールを 1 つを、以下のように配置およびプロパティを設定します。

コントロール名 プロパティ名 設定値
TextBox1 Text System.Data.SqlClient
TextBox2 Text Data Source=.\SQLEXPRESS;Initial Catalog=AdventureWorks;Integrated Security=SSPI
Button1 Text 実行

 


図 2. Windows フォームのデザイン

プロバイダ ファクトリを利用するコードの実装

基本クラスおよびプロバイダ ファクトリを使用するコードを記述します。

“Form1.cs” デザイン画面の “Button1” コントロールをダブルクリックし、以下の赤字で書かれているコードを記述します。

C#
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.Common;

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

        private void button1_Click(object sender, EventArgs e)
        {
            // プロバイダファクトリ作成
            DbProviderFactory fact = DbProviderFactories.GetFactory(textBox1.Text);

            // ファクトリにて DbConnecion へ固有プロバイダのインスタンス化
            using (DbConnection cnn = fact.CreateConnection())
            {
                cnn.ConnectionString = textBox2.Text;
                cnn.Open();

                // ファクトリにて DbCommand へ固有プロバイダのインスタンス化
                DbCommand cmd = fact.CreateCommand();
                cmd.Connection = cnn;
                cmd.CommandText = "SELECT COUNT(*) FROM Production.Product";
                MessageBox.Show(cnn.ToString() + " / " + cmd.ToString());
                MessageBox.Show("行数 = " + cmd.ExecuteScalar().ToString());
            }
        }
    }
}
 

まず始めに、基本クラスおよびプロバイダ ファクトリの各クラスを利用する際に名前空間を省略できるように、 using ディレクティブを記述しています。

“Button1” コントロールのクリック イベント ハンドラでは、“TextBox1” コントロールのテキスト値をもとに、固有のプロバイダ ファクトリを作成した後、基本クラスである DbConnection および DbCommand をプロバイダ ファクトリの CreateConnection および CreateCommand メソッドにて、インスタンス化しています。

その後、インスタンス化された各基本クラスの ToString の値、およびデータベースより取得した行数を、それぞれメッセージ ボックスにて表示しています。

動作と解説

作成した Windows アプリケーションを実行します。


図 3. サンプル アプリケーションの実行

そのまま “実行” ボタン (Button1 コントロール) をクリックし、基本クラスおよびプロバイダ ファクトリを使用した処理を実行します。


図 4. 実行結果 (System.Data.SqlClient

上記の通り、テキストボックスのデータ プロバイダ名 ("System.Data.SqlClient") および接続文字列をもとに、プロバイダ ファクトリにて各基本クラスが固有プロバイダ (SqlConnection / SqlCommand) にてインスタンス化された後、データ アクセスが実施されたことを確認します。

次に、 テキストボックスの値を下記の通り変更後、“実行” ボタンをクリックします。

コントロール名 設定値
TextBox1 System.Data.OleDb
TextBox2 Provider=SQLOLEDB;Data Source=.\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=AdventureWorks


 

図 5. 実行結果 (System.Data.OleDb

上記の通り、テキストボックスのデータ プロバイダ名 ("System.Data.OleDb") および接続文字列を変更することで、プログラムを修正および再ビルドすることなく、異なる固有プロバイダを使用でき、データ アクセスが実施されたことを確認します。

 

プロバイダ ファクトリおよび基本クラスは、従来に比べて固有のデータ プロバイダへの依存度を抑え、汎用的なプログラミングが行えるように ADO.NET 2.0 にて新たに追加された機能です。
従来から利用可能であった基本インターフェイスに比べて、クラスとして利用可能なため、汎用化できる部分が広がるとともに、固有のインスタンス化などはプロバイダ ファクトリにてカプセル化された形で実施することが出来るようになりました。

 

ただし、SQL ステートメント自体やパラメータの使用方法など、個々のプロバイダに依存している部分があるため考慮する必要があります。

プロバイダ ファクトリおよび基本クラスの詳細については、下記の技術情報を参照ください。

ADO.NET 2.0 基本クラスおよびファクトリによる汎用的なコーディング

 

おわりに

このように、基本クラスとプロバイダ ファクトリを使用することで、固有のデータ プロバイダへの依存度を最小限に抑えた汎用的なプログラミングを行うことが出来ます。

これにより、今まで以上に汎用的なデータ アクセス アプリケーションの開発を行うことが可能となります。

プロバイダ ファクトリの特徴を理解した上でデータ アクセス アプリケーション開発に、ぜひ活用ください。


Code Recipe

ページのトップへ