更新日: 2005 年 11 月 1 日

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

  • データ ソース構成ウィザードを使ったストアド プロシージャに対するコードの自動生成方法
  • ストアド プロシージャへの呼び出し

今回紹介するコード

C#
private void Form1_Load(object sender, EventArgs e)
{
    // コンボボックスのデータ連結
    comboBox1.DataSource  = nWindDataSet1.Customers;
    comboBox1.ValueMember = "CustomerID";
    // データグリッドのデータ連結
    dataGridView1.DataSource = nWindDataSet1.CustOrderHist;
    // 顧客リストの取得
    NWindDataSetTableAdapters. CustomersTableAdapter adapter
        = new NWindDataSetTableAdapters. CustomersTableAdapter ();
    adapter.Fill(nWindDataSet1.Customers);
}

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    // データセットのクリア
    nWindDataSet1.CustOrderHist.Clear();
    // パラメータを指定して呼び出す
    NWindDataSetTableAdapters. CustOrderHistTableAdapter adapter
        = new NWindDataSetTableAdapters. CustOrderHistTableAdapter ();
    adapter.Fill(nWindDataSet1.CustOrderHist, comboBox1.SelectedValue.ToString());
}
 

目次

はじめに
Windows アプリケーションの開発準備をする
画面をデザインする
データセットとテーブルアダプタを作成する
コードを実装する
実行する
おわりに

Visual Basic の内容はこちらに掲載しています。
10 行でズバリ !! ADO.NET によるストアド プロシージャの実行 (VB)

 


はじめに

Visual Studio 2005 に組み込まれている各種のウィザードと ADO.NET で提供される高機能なクラスを利用すると、ストアド プロシージャの実行を行うアプリケーションを簡単に作成することができます。ストアド プロシージャにパラメータを渡し、データグリッドにその結果を表示する簡単な Windows アプリケーションを作成する例を見ていきましょう。

なお、ここでは、比較的データ構造が簡単な "Nothwind" サンプル データベース (SQL Server 2000 付属) のデータベース ファイルを使用します。 ただし、サンプル データベースに、商品コードや顧客コードなどの一つの引数を渡して実績集計をするようなストアド プロシージャが一つと、その商品コードや顧客コードを含むテーブルが一つあれば、ここに挙げる同様の実装が可能です。

Windows アプリケーションの開発準備をする

Visual Studio 2005 を起動して、新しいプロジェクトを作成します([ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします)。

ここでは、プロジェクトの種類ペインで [Visual C#] を選択し、テンプレート ペインで、[Windows アプリケーション] を選択します。[プロジェクト名] ボックスに 「SProcAppCS」 と入力します。[場所] ボックスには、「C:\Test」 というパスを入力します。 ここで、[OK] ボタンをクリックして、プロジェクトを作成します。

これで、今回のアプリケーションの開発準備が完了しました。

図 1. ストアド プロシージャのためのプロジェクトを新規に作成する

 

画面をデザインする

ここでは、ストアド プロシージャへ渡すパラメータを選択するための ComboBox コントロールと、ストアド プロシージャの実行結果を表示するための DataGridView コントロールを配置します。また、 ComboBox の説明のために、Label コントロールを配置します。(図2) 各コントロールの配置は、図に正確に合わせる必要はありません。

図 2. 画面上にコントロールを配置する

 

データセットとテーブルアダプタを作成する

Visual Studio 2005 では、データ アクセスに関するコードを生成する様々な機能を提供しています。[データ ソース] ウィンドウを使用すると、対話形式で様々なコードを生成できます。ここでは、検索結果の受け皿となるデータセットと、ストアド プロシージャを呼び出すためのコンポーネントとして利用するテーブル アダプタを作成します。

まず、[表示] メニューから [データ ソースの表示] をクリックして、図3 のような [データ ソース] ウィンドウを表示します。この後の操作方法は、原則として 『 10 行でズバリ !! ADO.NET と Visual Studio 2005 によるデータ アクセス入門』 で説明した [データ ソース] ウィンドウの使用方法と同じです。ただし、この後のウィザードのデータベース オブジェクトを指定する画面では、テーブルではなく、ストアド プロシージャを指定します。

図 3. [データ ソース] ウィンドウ

 

 

[データ ソース] ウィンドウの左端にある [新しいデータ ソースの追加] ボタンをクリックします。(ボタンの名称は、マウスポインタをボタンの上に移動することで、ツールヒントとして表示されます。) すると、データ ソース構成ウィザードが起動します。(図4)

図4. データ ソース構成ウィザード

 

図4 では、[データ ベース] を選択して、[次へ] ボタンをクリックします。

図5 のように、データ接続を選択する画面になるので、画面の右側にある [新しい接続] ボタンをクリックします。 

図5 データ接続を選択する

 

図6 のように、[接続の追加] ダイアログ ボックスが開くので、利用可能なサンプル データベースを指定します。

ここでは、プログラム実行時に NorthWind のデータベース ファイルをSQL Server Express へアタッチすることにします。NorthWind データベース ファイルは、あらかじめ SQL Server 2005 からデタッチして、C:\Test\_DB に置いておきます。図5 のように、[データ ソース] 欄では「SQL Server データベース ファイル」を指定し、[データベース ファイル名] 欄では「C:\Test\_DB\northwind.mdf」と指定しています。[Windows 認証を使用する] オプションを選択して、[OK] をクリックします。

図6. 接続するデータベースを指定する

 

図5 のデータ接続の選択画面に戻るので、[次へ] をクリックします。前述のように、データベース ファイルを指定した場合、プロジェクト内にコピーするか問い合わせが表示されるので (図7) 、[いいえ] をクリックします。

図7. プロジェクト内にコピーするか問い合わせが表示される

 

次に、データベースにアクセスするための接続文字列を、アプリケーション構成ファイルに保存するか問い合わせが表示されます (図8)。Visual Studio 2005 では、接続文字列はソース コードに書かずに、アプリケーション構成ファイルに切り分けることが可能です。これによって、アプリケーションの運用時に後から接続先を変えるとき、コー ド修正や再コンパイルをせずに、構成ファイルを変更するだけで済みます。[次の名前で接続を保存する] チェックボックスをチェックしたままにして、[次へ] をクリックします。

図8. 接続文字列は、アプリケーション構成ファイルに保存できる

 

次に、データベース オブジェクトを選択する画面になるので (図9)、その画面のツリー上にある [テーブル] ノードを展開し、テーブルとして、[Customers] テーブルの [CustomerID] 列のみをチェックし (図9)、さらに、[ストアド プロシージャ] ノードを展開して、[CustOrderHist] というストアド プロシージャをチェックします。 また、[データセット名] のボックスには、「NWindDataSet」 と指定します。

図9. コンボボックスに使用するテーブルを指定する

 

図10. ストアド プロシージャを指定する

 

ウィザードが終了すると、[データ ソース] ウィンドウには、指定した二つのテーブルが表示されます。(図11)

図11. データセット NWindDataSet の構造が表示される

 

図11 は、生成されたデータセットの構造を表しており、ルートノードの「NWindDataSet」は、このデータセットのクラス名です。このクラスは、 DataSet クラスから派生したクラスで、ここで指定したテーブルをキュッシュするための専用のデータ構造が定義されています。[NWindDataSet.xsd] ファイル ノードの下の、NWindDataSet.Designer.cs ファイル (図12) に NWindDataSet クラスの定義があります。

図12. データセット NWindDataSet クラスのソース コードのファイルが生成される

 

また、[データ ソース] ウィンドウの各テーブル ノードを展開すると、各テーブルの列名や、ストアド プロシージャが実行結果として返す結果セットの列名が分かります。この表示から、CustOrderHist ストアド プロシージャの実行結果として、ProductName 列と Total 列からなる結果セットが返ることが分かります。

図13. 列名やテーブル間の関係が表示される

 

なお、今回使用しているストアド プロシージャは、以下のとおりです。顧客ID 「@CustomerID」を引数として受け取り、当該顧客の取引記録を集計して返します。

 

C#
ALTER PROCEDURE CustOrderHist @CustomerID nchar(5)
AS
SELECT ProductName, Total=SUM(Quantity)
FROM Products P, [Order Details] OD, Orders O, Customers C
WHERE C.CustomerID = @CustomerID
AND C.CustomerID = O.CustomerID AND O.OrderID = OD.OrderID 
AND OD.ProductID = P.ProductID
GROUP BY ProductName
RETURN 0
 

コードを実装する

画面デザインとデータ ソース構成ウィザードの実行によって、必要なテーブル アダプタとデータセットが自動生成されました。最後にコードを実装します。

このコードでは、初めて画面が表示されたときに実行される Form1_Load() プロシージャで、先ほど作成したデータセットとコントロールの連結と、"Cutomers" テーブルの読み込みを行います。

次に、コンボボックス コントロールでアイテムが選択されたときに発生するイベント プロシージャで、ストアド プロシージャの実行をしています。このときに、コンボボックスで選択された "CustomerID" をストアド プロシージャのパラメータとして渡しています。

まず、この後のコード記述を簡単にするため、ツールボックスからフォーム デザイナへデータセットをドロップして、コード上にデータセット インスタンスの作成コードと変数定義を自動生成させることにします。ツールボックスの [データ] タブから DataSet をフォームにドロップします。図14のようなダイアログ ボックスが表示されるので、データセットとして 「SProcAppCS.NWindDataSet」 が選択されていることを確認し、[OK] をクリックします。このデータセットは、先のデータ ソース構成ウィザードで作ったものです。

図14. データセットを追加する

 

すると、図15 のようにデザイナ下部 (トレイ) に、データセットのインスタンスを表すアイコンが貼り付きます。

図15. データセットのインスタンスが追加される

 

次に、Windows フォーム デザイナ上で、フォームの余白と、ComboBox をそれぞれダブルクリックして、二つのイベント ハンドラを作成してください。次に、以下のコードを入力してください。

C#
private void Form1_Load(object sender, EventArgs e)
{
    // コンボボックスのデータ連結
    comboBox1.DataSource  = nWindDataSet1.Customers;
    comboBox1.ValueMember = "CustomerID";
    // データグリッドのデータ連結
    dataGridView1.DataSource = nWindDataSet1.CustOrderHist;
    // 顧客リストの取得
    NWindDataSetTableAdapters. CustomersTableAdapter adapter
        = new NWindDataSetTableAdapters. CustomersTableAdapter ();
    adapter.Fill(nWindDataSet1.Customers);
}

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    // データセットのクリア
    nWindDataSet1.CustOrderHist.Clear();
    // パラメータを指定して呼び出す
    NWindDataSetTableAdapters. CustOrderHistTableAdapter adapter
        = new NWindDataSetTableAdapters. CustOrderHistTableAdapter ();
    adapter.Fill(nWindDataSet1.CustOrderHist, comboBox1.SelectedValue.ToString());
}
 

 

このコードに登場する「CustomerTableAdaper」や「CustOrderHistAdapter」は、テーブル アダプタと呼ばれ、DataAdapter を使用したデータ アクセスをカプセル化したコンポーネントです。それぞれのオブジェクトの Fill メソッドを呼び出すことで、テーブルの取得やストアド プロシージャの実行が行われます。特に、二つ目の CustOrderHistTableAdapter クラスの Fill メソッドの 2 番目のパラメータでは、顧客コードを渡している点に注意してください。これは、コード生成時にストアド プロシージャにパラメータが必要であることを認識した結果です。この Fill メソッドのソース コードは、NWindDataSet.Designer.cs の中にあるので、調べてみてください。

実行する

ここで、実行してみます。 [Ctrl] +[ F5] キーを押すか、[デバッグ] メニューの [デバッグなしで開始] をクリックします。

コンボボックスで "CustomerID" を選択するたびに、対応する結果がデータグリッドに表示されていることが確認できるはずです。

図 16 アプリケーションを実行する

 

おわりに

本稿のとおり、Visual Studio 2005 のデータ ソース構成ウィザードを使うと、ストアド プロシージャに渡すべきパラメータも認識して、相応のパラメータを受け取る Fill メソッドがテーブル アダプタ内に自動生成されます。Visual Studio 2005 を使うことで、ストアド プロシージャを実行するアプリケーションは容易に構築できることが分かりました。


Code Recipe

ページのトップへ