.NET TIPS [ASP.NET]ストアド・プロシージャの出力パラメータをASP.NETページに反映させるには?[2.0、3.0、3.5、C#、VB]山田 祥寛2009/04/16 |
|
「TIPS:[ASP.NET]GridViewコントロールにストアド・プロシージャの結果を反映させるには?」では、ストアド・プロシージャに対してサーバ・コントロールの値を引き渡す方法について紹介したが、ストアド・プロシージャでは、その出力パラメータを利用することで、ストアド・プロシージャで処理した結果の値をアプリケーションにフィードバックすることもできる。
ここでは、前掲のTIPSで作成したSelectProcプロシージャを修正して、ストアド・プロシージャで取得したレコード件数を出力パラメータとしてASP.NETページに引き渡し、表示させるサンプルを紹介する。次の画面はその実行例だ。
Bookテーブルから取り出したレコード件数を表示 |
「6件が合致しました。」と、レコード件数が表示されている。 |
1. ストアド・プロシージャに出力パラメータを追加する
前掲のTIPSで定義済みのストアド・プロシージャSelectProcに対して、次のコードを追加してほしい。既存のストアド・プロシージャを編集するには、Visual StudioのIDEの[サーバー エクスプローラ]の[データ接続]−[DotNetTips.mdf]−[ストアド プロシージャ]−[SelectProc]をダブルクリックすればよい。これにより、中央のコード・エディタでストアド・プロシージャのコードが開くので、次のコードのように変更する。
|
|
ストアド・プロシージャSelectProcの変更(追記部分は太字) |
*1 ストアド・プロシージャの先頭部分が、「CREATE PROCEDURE」から「ALTER PROCEDURE」に変更になっていることに気付くだろう。このように既存のストアド・プロシージャを変更する際にはALTER PROCEDURE命令を使用する。 |
出力パラメータを定義するには、
パラメータ名 データ型 OUTPUT
のように、パラメータ定義の末尾にOUTPUTキーワードを指定する必要がある()。
出力パラメータに対して値をセットするのは、SELECT命令の役割だ(代わりにSET命令を使っても構わない)。
SELECT 変数名 = 値
の形式で値を設定できる。「@@ROWCOUNT」は、SQL Serverで用意されているシステム関数の1つで、直前のSQL命令によって影響を受けた行数(取得されたレコード数)を返す。
編集が完了したら、SelectProcプロシージャを保存しておこう。
2. データソース・コントロールのパラメータを定義する
追加した出力パラメータ「@result」を受け取るには、データソース・コントロール(SqlDataSourceコントロール)にも明示的にパラメータ定義を追加しておく必要がある。
フォーム・デザイナ上のSqlDataSourceコントロールの右肩からタスク・メニューを開き、[データソースの構成]を選択する。前掲のTIPSで設定済みのデータ構成ウィザードが開くので、[パラメータの定義]ページまで進めてほしい。パラメータ一覧に、ストアド・プロシージャSelectProcで定義した「result」が追加されていることが確認できるはずだ。
[パラメータの定義]ページ |
パラメータ一覧からresultを選択したうえで、[詳細設定プロパティの表示]リンク(※上の画面では[詳細設定プロパティを隠す]となっている)をクリックする。すると、パラメータ(Parameterオブジェクト)のプロパティ一覧(※上の画面の右半分)が表示されるので、ここでは[Direction]プロパティを「Output」に設定しておこう。
Directionパラメータはパラメータの方向(種類)を表すためのプロパティで、以下の表の値を指定できる。
設定値 | 概要 |
Input | 入力パラメータ |
InputOutput | 入出力パラメータ |
Output | 出力パラメータ |
ReturnValue | 戻り値*2 |
Directionプロパティの設定値(ParameterDirection列挙体のメンバ) |
*2 戻り値については、「TIPS:[ASP.NET]ストアド・プロシージャの戻り値をASP.NETページに反映させるには?」で後日解説する予定だ。 |
ここでは「Output」を指定しているので、resultパラメータは出力パラメータであると見なされ、ASP.NETページから参照可能になる。
3. WebフォームにLiteralコントロールを追加する
出力パラメータの値を反映させるためのLiteralコントロールを、以下の画面の要領でWebフォームに追加する。
Webフォームのフォーム・レイアウト(Stored.aspx) | |||
以下のコントロールを配置する。 | |||
|
4. 出力パラメータの値を取得する
最後に、SqlDataSourceコントロールがデータを取得したタイミングで、取得したレコード数(=出力パラメータの値)をLiteralコントロールに反映させる。これには、SqlDataSourceコントロールのSelectedイベントを使用する。Selectedイベントは、SqlDataSourceコントロールがSELECT操作を行った直後に発生するイベントである。
Selectedイベント・ハンドラに記述するコードは、以下のとおり。
|
||
出力パラメータを取得するためのイベント・ハンドラ(Stored.aspx。上:C#、下:VB) |
データソース・コントロールで定義されたコマンドにアクセスするには、Selectedイベント・ハンドラの第2引数として受け取ったSqlDataSourceStatusEventArgsオブジェクトからCommandプロパティを参照すればよい。Commandプロパティはデータソース・コントロールに関連付いたコマンドをDbParameterオブジェクトとして返すので、そのParametersプロパティを介して個々のパラメータ(=DbParameterCollectionオブジェクト)にアクセスできる。ここでは出力パラメータ@resultを取得し、その値をLiteralコントロールのTextプロパティに代入しているわけだ。
以上を理解できたら、Stored.aspxを実行してみよう。冒頭の画面のように、グリッド表に表示されたレコード件数がLiteralコントロール上にも反映されていれば、出力パラメータは正しく取得できている。
利用可能バージョン:.NET Framework 2.0 利用可能バージョン:.NET Framework 3.0 利用可能バージョン:.NET Framework 3.5 カテゴリ:Webフォーム 処理対象:GridViewコントロール 使用ライブラリ:GridViewコントロール 関連TIPS:TIPS:[ASP.NET]GridViewコントロールにストアド・プロシージャの結果を反映させるには? 関連TIPS:[ASP.NET]ストアド・プロシージャの戻り値をASP.NETページに反映させるには?(後日公開予定) |
「.NET TIPS」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|