[ホーム] -
[Windows 2003 FAQ 一覧] - [ASPを使用し、Webページからデータベースへのアクセス]
ASP(Active Server Page)を使用して Web ページからデータベースへアクセスする方法を紹介します。
(*)Windows Server 2003 時代の古い情報です。
Webフォームのデータ連結の仕組みにより、Webフォーム上のコントロールに対してデータの表示を簡単に実現することは可能です。しかしこれは一方向のみです。更新するにはその他の処理が必要です。ただ書き戻すほど複雑な処理が必要とされないよう工夫されています。
(1)準備
Windows サーバを用意します。本サンプルでは以下が導入されているものとします。
・Windows 2000
・IIS ver5以降
・.NET Framework
・Visual Studio.net (開発環境なので、その他クライアント上に導入しても良い)
(2)新しいプロジェクトを作成します。テンプレートには「ASP.NET Web アプリケーション」を指定します。
(3)データアダプタ・データセットを作成します。
Webページフォームからデータベースにアクセスするには以下の方法があります
・データセットを使用
・SQLステートメントあるいはストアドプロシージャを発行
今回は分かりやすいようにデータセットを使用します。
・ウイザードを使用しデータアダプタを作成します。
(本サンプルではNorthwind、テーブルは「Categories」を選択します。)
データベースの読み取り、書き込みに必要なSQL ステートメントを設定します。
ウイザードの途中で、データベースへアクセスするSQLステートメントを生成します。
例:
SELECT CategoryID, CategoryName, Description
FROM Categories
・データセットを作成します。
「SQLDataAdapter1」が選択された状態で「データ」「データセットの作成」を選択します。
例としてデータセット名にdsCategoriesという名前を付けます。
(3)DataGridコントロールの追加
ツールボックス上の「Webフォーム」から「DataGrid」を選択し、Webフォーム上にドラッグします。
"プロパティビルダを使用"でデータソースを指定することにより、データセットとDataGridを関連付けます。
データソース:dsCategories1
データメンバ:Categories
データキーフィールド:CategoryID
(4)DataGridへのデータ表示
データセットにデータがロードされても、DataGridには自動的に表示されません。
ページのロード時に明示的に指定する必要があります。
Page_Loadイベントに以下のとおり指定します。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
SqlDataAdapter1.Fill(dsCategories1)
If Not IsPostBack Then
DataGrid1.DataBind()
End If
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
(5)イベントハンドラの追加
デフォルトでは各行に「編集」「更新」「キャンセル」ボタンが表示されません。表示されるには「プロパティビルダ」
の「使用可能な列」で設定します。
追加したらそれぞれのイベントハンドラを作成します。
・EditCommand のイベントハンドラ
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
DataGrid1.EditItemIndex = e.Item.ItemIndex
DataGrid1.DataBind()
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
・CancelCommandのイベントハンドラ
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
DataGrid1.EditItemIndex=-1
DataGrid1.DataBind()
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
・UpdateCommand
取得された行のindexを取得し、更新された行を識別します。
Dim key As String=DataGrid1.DataKeys(e.Item.ItemIndex).ToString()
渡されたItemオブジェクトのindexを取得して、更新された行を認識します。
Dim categoryName, categoryDescription As String
Dim tb As TextBox
tb = CType(e.Item.Cells(2).Controls(0), TextBox)
categoryName = tb.Text
tb = CType(e.Item.Cells(3).Controls(0), TextBox)
categoryDescription = tb.Text
データセット内の対応する行を検索します。FindByメソッドを使用します。
Dim r As dsCategoriesRow
r=DsCategories1.Categories.FindByCategoryID(key)
r.CategoryName=categoryName
r.Descrittion=categoryDescription
最後にデータセット内の変更内容をデータベースで更新します。
SqlDataAdapter1.Update(DsCategories1)
DataGrid1.DataBind()
編集モードを解除しデータを連結します。
DataGrid1.EditItemIndex=-1
DataGrid1.DataBind()
まとめると以下のとおりとなります。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
Dim key As String=DataGrid1.DataKeys(e.Item.ItemIndex).ToString()
Dim categoryName, categoryDescription As String
Dim tb As TextBox
tb = CType(e.Item.Cells(2).Controls(0), TextBox)
categoryName = tb.Text
tb = CType(e.Item.Cells(3).Controls(0), TextBox)
categoryDescription = tb.Text
Dim r As Dim r As dsCategories.CategoriesRow
r=DsCategories1.Categories.FindByCategoryID(key)
r.CategoryName=categoryName
r.Description() = categoryDescription
SqlDataAdapter1.Update(DsCategories1)
DataGrid1.DataBind()
DataGrid1.EditItemIndex=-1
DataGrid1.DataBind()
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
最後にサーバ上から以下を実行し、正常に編集・更新可能なことを確認します。
http://localhost/WebApplication1/WebForm1.aspx