連載:VS 2005でいってみようDBプログラミング

第5回 開発生産性を向上させるASP.NET 2.0のサーバ・コントロール

山田 祥寛(http://www.wings.msn.to/
2006/07/01
Page1 Page2 Page3 Page4

[4]ページ上のプロパティ情報を設定する

 次にページ上のコントロールに対して、必要なプロパティ情報を表5のように設定します。

コントロール プロパティ
Wizard(wiz) ActiveStepIndex 0
HeaderText WINGSメンバ登録
SqlDataSource(sds) ConnectionString MyDb*5
InsertQuery (下記参照)
RadioButtonList(rdoSex) Items 男/女
TextBox(txtEmail) Columns 30
TextBox(txtLang) Columns 30
TextBox(txtSelf) Columns 22
Rows 3
TextMode MultiLine
Label(lblResult) Text メンバ登録が正常終了しました。
表5 wizard.aspxのプロパティ設定
*5 MyDbは第2回で設定した接続名です。

 SqlDataSourceコントロールのInsertQueryプロパティでは、ウィザード上で最終的に[完了]ボタンがクリックされたときに実行される挿入(INSERT)コマンドを定義します。

 InsertQueryプロパティを定義するには、プロパティ・ウィンドウのInsertQueryプロパティから[...]ボタンをクリックしてください。[コマンドおよびパラメータのエディタ]ダイアログが開きますので、[クエリビルダ]ボタンをクリックします。


図7 [コマンドおよびパラメータのエディタ]ダイアログ(1)

 すると[テーブルの追加]ダイアログが開きますので、本節冒頭で作成したmembersテーブルを選択し、[追加]ボタンをクリックしてください。[閉じる]ボタンをクリックすると[クエリビルダ]ダイアログが開きます。



membersテーブルを追加して[閉じる]ボタンをクリック


図8 [クエリビルダ]ダイアログ
  ダイアグラム・ペイン(対象となるテーブルをダイアグラム表示。リレーションの設定や操作対象列の設定が可能)。
  グリッド・ペイン(SQLコマンドの条件式やソート式などの指定が可能)。
  SQLペイン( の指定に基づいてできたSQLコマンドを表示)。
  結果ペイン(SQL実行時の結果を表示)。

 クエリビルダは、[ダイアグラム・ペイン][グリッド・ペイン][SQLペイン][結果ペイン]の4つのペインに分かれています。

 ダイアグラム・ペインには先ほど選択したmembersテーブルが表示されますので、オートインクリメントが設定されたmidフィールドを除くすべてのフィールドをチェックします*6

*6 対象のフィールドをグリッド・ペインにドラッグ&ドロップしても構いません。

 グリッド・ペインに列が表示されたのを確認できたら、[新しい値]列に、それぞれ、

@ + フィールド名

の形式で値を入力しましょう。「@」で始まる値は、プログラムから動的に引き渡されるパラメータのプレイス・ホルダを表します。この時点でSQLペイン上に以下のようなSQL命令ができていればOKです。

INSERT INTO members (name, sex, email, lang, self)
       VALUES (@name,@sex,@email,@lang,@self)

 [OK]ボタンをクリックすると、先ほどの[コマンドおよびパラメータのエディタ]ダイアログに戻りますので、[パラメータを最新の情報に更新]ボタンをクリックします。これによって、SQL命令に含まれるパラメータがSqlDataSourceコントロール上の挿入パラメータとして登録されました。


図9 [コマンドおよびパラメータのエディタ]ダイアログ(2)
[パラメータを最新の情報に更新]ボタンをクリックすると、SQL命令上で定義されたプレイス・ホルダをパラメータとして、SqlDataSourceコントロールに登録できる。

[5][完了]ボタン・クリック時の処理を定義する

 以上でフォーム・デザイナ上の作業は完了です。次に、ウィザード上で[完了]ボタンをクリックしたときの処理をイベント・ハンドラに記述してみましょう。コード・エディタから以下のように記述してください。

' FinishButtonClickイベント・ハンドラ
Protected Sub wiz_FinishButtonClick(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.WizardNavigationEventArgs)
  sds.Insert()
End Sub

' Insertingイベント・ハンドラ
Protected Sub sds_Inserting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.SqlDataSourceCommandEventArgs)
  e.Command.Parameters("@name").Value = txtName.Text
  e.Command.Parameters("@sex").Value = rdoSex.SelectedValue
  e.Command.Parameters("@email").Value = txtEmail.Text
  e.Command.Parameters("@lang").Value = txtLang.Text
  e.Command.Parameters("@self").Value = txtSelf.Text
End Sub

' Insertedイベント・ハンドラ
Protected Sub sds_Inserted(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.SqlDataSourceStatusEventArgs)
  If e.Exception IsNot Nothing Then
    e.ExceptionHandled = True
    lblResult.Text = "エラー発生:" & e.Exception.Message
  End If
End Sub
リスト2 [完了]ボタン・クリック時の処理を記述したコード(Wizard.aspx)

 [完了]ボタンをクリックしたときに発生するのはFinishButtonClickイベントです。ちなみに、Wizardコントロールではそのほかにも表6のようなイベントが用意されており、これらのイベントを利用することで、ウィザード上の各タイミングでの処理をカスタマイズすることも可能です。

イベント 発生タイミング
ActiveStepChanged ステップを切り替えたとき
CancelButtonClick [キャンセル]ボタンがクリックされたとき
FinishButtonClick [完了]ボタンがクリックされたとき
NextButtonClick [次へ]ボタンがクリックされたとき
PreviousButtonClick [戻る]ボタンがクリックされたとき
SideBarButtonClick サイド・バー上のリンクがクリックされたとき
表6 Wizardコントロールの主要なイベント

 ここでは、FinishButtonClickイベント・ハンドラでSqlDataSourceコントロールのInsertメソッドを呼び出し、先ほど設定した挿入コマンドを実行しているわけです。

 もっとも、この時点ではまだINSERT命令のプレイス・ホルダに具体的なパラメータが渡されていませんので、Wizardコントロール上に配置された各サーバ・コントロールの値を引き渡す必要があります。この処理を行っているのが、SqlDataSourceコントロールのInsertingイベント・ハンドラです。

 Insertingイベント*7は挿入コマンドの実行「直前」に発生するイベントで、主にパラメータ値の検査や加工、セットなどを行うために使用します。

*7 ちなみに、SqlDataSourceコントロールには、ほかにもUpdating/Updated、Deleting/Deleted、Selecting/Selectedイベントが用意されており、それぞれのコマンド実行前後における処理を記述できます。

 データソース・コントロール(SqlDataSourceコントロール)で定義されたコマンドにアクセスするには、イベント・ハンドラの第2パラメータとして受け取ったSqlDataSourceCommandEventArgsオブジェクトからCommandプロパティを使用します。これによって、データソース・コントロールで定義されたコマンドをDbCommandオブジェクトとして取得できますので、そのParameterプロパティを介して取得したDbParameterCollectionオブジェクトから個々のパラメータにアクセスします。

 また、Insertedイベントは挿入コマンドの実行「直後」に発生するイベントで、主に実行結果(影響を受けた行数など)を取得したり、例外発生時の処理を記述したりするためなどに使用します。

 ここでは、イベント・ハンドラの第2パラメータとして受け取ったSqlDataSourceStatusEventArgsオブジェクトからExceptionプロパティにアクセスすることで、挿入コマンドの実行によって発生した例外情報(Exceptionオブジェクト)を取得しているわけです。ここではExceptionプロパティの値がNothingでない場合に何らかの例外が発生したものと見なし、以降の処理を実行します。

 ExceptionHandledプロパティはデータベースによって発生した例外が処理されたかどうかを示すブール値を表し、SqlDataSourceコントロール上で例外が発生した場合にFalseがセットされます。自前で例外を処理する場合には、本プロパティをTrueに設定しないと、SqlDataSourceコントロールが例外をスローしますので注意してください。

 ここでは、ExceptionオブジェクトのMessageプロパティで例外メッセージを取得し、Wizardコントロール上の完了画面に表示します。

 以上を理解したら、Wizard.aspxを実際に実行してみましょう。図3のようにウィザード・ページが順番に表示されることが確認できれば成功です。登録成功のメッセージを画面上で確認したら、サーバ・エクスプローラからmembersテーブルに正しくデータが格納されていることも確認してみましょう。


 INDEX
  Visual Studio 2005でいってみようDBプログラミング
  第5回 開発生産性を向上させるASP.NET 2.0のサーバ・コントロール
    1.GridView/DetailsViewコントロールで一覧/詳細マルチビューを生成する
    2.Wizardコントロールでウィザード形式の入力画面を作成する(1)
  3.Wizardコントロールでウィザード形式の入力画面を作成する(2)
    4.TreeViewコントロールでツリー・メニューを作成する
 
インデックス・ページヘ  「Visual Studio 2005でいってみようDBプログラミング」


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 記事ランキング

本日 月間