.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]をダブルクリックすればよい。これにより、中央のコード・エディタでストアド・プロシージャのコードが開くので、次のコードのように変更する。

ALTER PROCEDURE SelectProc  *1
  @price INT,
  @result INT OUTPUT   ……
AS
  IF @price = 0
    BEGIN
      SELECT * FROM book ORDER BY price DESC
    END
  ELSE
    BEGIN
      SELECT * FROM book
        WHERE price >= @price - 1000
          AND price < @price
    END
  SELECT @result = @@ROWCOUNT   ……
ストアド・プロシージャ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)
以下のコントロールを配置する。
  Literalコントロール(IDは「ltrResult」)。

4. 出力パラメータの値を取得する

 最後に、SqlDataSourceコントロールがデータを取得したタイミングで、取得したレコード数(=出力パラメータの値)をLiteralコントロールに反映させる。これには、SqlDataSourceコントロールのSelectedイベントを使用する。Selectedイベントは、SqlDataSourceコントロールがSELECT操作を行った直後に発生するイベントである。

 Selectedイベント・ハンドラに記述するコードは、以下のとおり。

protected void sds_Selected(Object sender, SqlDataSourceStatusEventArgs e) {

  ltrResult.Text = String.Format(
    "{0}件が合致しました。",
    e.Command.Parameters["@result"].Value);

}
Protected Sub sds_Selected(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.SqlDataSourceStatusEventArgs)

  ltrResult.Text = String.Format( _
    "{0}件が合致しました。", _
    e.Command.Parameters("@result").Value)

End Sub
出力パラメータを取得するためのイベント・ハンドラ(Stored.aspx。上:C#、下:VB)

 データソース・コントロールで定義されたコマンドにアクセスするには、Selectedイベント・ハンドラの第2引数として受け取ったSqlDataSourceStatusEventArgsオブジェクトからCommandプロパティを参照すればよい。Commandプロパティはデータソース・コントロールに関連付いたコマンドをDbParameterオブジェクトとして返すので、そのParametersプロパティを介して個々のパラメータ(=DbParameterCollectionオブジェクト)にアクセスできる。ここでは出力パラメータ@resultを取得し、その値をLiteralコントロールのTextプロパティに代入しているわけだ。

 以上を理解できたら、Stored.aspxを実行してみよう。冒頭の画面のように、グリッド表に表示されたレコード件数がLiteralコントロール上にも反映されていれば、出力パラメータは正しく取得できている。End of Article

利用可能バージョン:.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
[ASP.NET]ストアド・プロシージャの戻り値をASP.NETページに反映させるには?
[ASP.NET]GridViewコントロールにストアド・プロシージャの結果を反映させるには?
[ASP.NET]GridViewコントロールでデータソースの内容を表示するには?
[ASP.NET]GridViewコントロールの表示データを特定条件で絞り込むには?
[ASP.NET]GridView+DetailsViewコントロールで一覧/明細画面を作成するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間