チュートリアル : LinqDataSource コントロールと DetailsView コントロールを使用したデータの取得、更新、挿入、および削除
更新 : 2007 年 11 月
このチュートリアルでは、単純なデータベース テーブルと、LinqDataSource コントロールを使用する Web ページを作成します。この Web ページを使用すると、ユーザーはデータベース テーブルからデータを取得、更新、挿入、および削除できます。データを表示するには、DetailsView コントロールを使用します。LinqDataSource コントロールを使用すると、SELECT、UPDATE、INSERT、または DELETE の各ステートメントを記述しなくても、これらの操作をすべて実行できます。
値を含むデータベース テーブルを表すクラスを作成するには、オブジェクト リレーショナル デザイナを使用します。LinqDataSource コントロールはこの生成されたクラスと対話して、データを取得、更新、挿入、および削除します。
前提条件
独自の開発環境でこの手順を実装するための要件は次のとおりです。
Visual Studio 2008 またはVisual Web Developer Express Edition
使用するコンピュータにインストールされた SQL Server Express Edition。SQL Server をインストールした場合、代わりに使用することもできますが、いくつかの手順を微調整する必要があります。
ASP.NET Web サイト。
データベース テーブルの作成
このチュートリアルの手順を実行するには、データベース テーブルが必要です。テーブルがない場合は、次の手順を実行してテーブルを作成します。既存のテーブルを使用する場合、一部の手順は使用するデータベースと完全に一致しません。ただし、チュートリアルで説明する概念は同じになります。
データベース テーブルを作成するには
Web サイトに App_Data フォルダがない場合は、ソリューション エクスプローラでプロジェクトを右クリックし、[ASP.NET フォルダの追加] をクリックして、[App_Data] をクリックします。
App_Data フォルダを右クリックし、[新しい項目の追加] をクリックします。
[インストールされているテンプレート] で、[SQL データベース] を選択し、ファイル名を Reviews.mdf に変更して [追加] をクリックします。
サーバー エクスプローラで、Reviews.mdf ノードを開き、テーブル フォルダを右クリックします。
[新しいテーブルの追加] をクリックします。
テーブルに次の列を作成します。
列名
データ型
プロパティ
MovieID
int
IsIdentity = Yes
null 以外
主キー
Title
nvarchar(50)
Theater
nvarchar(50)
Review
nvarchar(1000)
Score
int
null 以外
作成したテーブルを MovieReviews という名前で保存します。
サンプル データを使用して MovieReviews テーブルにレコードを追加します。
サーバー エクスプローラで、MovieReviews テーブルを右クリックし、[テーブル データの表示] をクリックします。MovieID の値はデータベースによって生成されるため、値を指定する必要はありません。
データベース エンティティを表すクラスの作成
LinqDataSource コントロールを操作するには、データベース エンティティを表すクラスを使用します。Visual Studio 2008 または Visual Web Developer Express Edition のツールを使用して、これらのクラスを作成できます。
MovieReviews テーブルのクラスを作成するには
Web サイトに App_Code フォルダがない場合は、ソリューション エクスプローラでプロジェクトを右クリックし、[ASP.NET フォルダの追加] をクリックして、[App_Code] をクリックします。
App_Code フォルダを右クリックし、[新しい項目の追加] をクリックします。
[インストールされているテンプレート] で、[LINQ to SQL クラス] テンプレートを選択し、ファイル名を Reviews.dbml に変更して [追加] をクリックします。
[オブジェクト リレーショナル デザイナ] が表示されます。
サーバー エクスプローラで、MovieReviews テーブルを [オブジェクト リレーショナル デザイナ] ウィンドウへドラッグします。
MovieReviews テーブルとその列が、デザイナ ウィンドウに MovieReview という名前のエンティティとして表されます。
Reviews.dbml ファイルを保存します。
ソリューション エクスプローラで、Reviews.designer.cs ファイルまたは Reviews.designer.vb ファイルを開きます。
ReviewsDataContext と MovieReview のクラスがあることを確認します。ReviewsDataContext クラスはデータベースを表し、MovieReview クラスはデータベース テーブルを表します。ReviewsDataContext クラスのパラメータなしのコンストラクタは、Web.config ファイルから接続文字列を読み取ります。
Web.config ファイルを開きます。
connectionStrings 要素に接続文字列が追加されていることを確認します。
クラス ファイルと Web.config ファイルを閉じます。
LinqDataSource コントロールの作成および構成
データベース テーブル、およびデータベース エンティティを表すクラスを作成したので、ASP.NET Web ページで LinqDataSource コントロールを使用してデータを管理します。
LinqDataSource コントロールを作成して構成するには
Visual Studio で、新しい ASP.NET Web ページを作成し、デザイン ビューに切り替えます。
ツールボックスの [データ] タブで、LinqDataSource コントロールをドラッグして Web ページ上の form 要素内にドロップします。
ID プロパティは LinqDataSource1 のままにしておくことができます。
ContextTypeName プロパティを ReviewsDataContext に設定します。
TableName プロパティを MovieReviews に設定します。
AutoPage を true に設定し、ソース ビューに切り替えます。
LinqDataSource コントロールの宣言マークアップの例を次に示します。
<asp:LinqDataSource ContextTypeName="ReviewsDataContext" TableName="MovieReviews" AutoPage="true" ID="LinqDataSource1" runat="server"> </asp:LinqDataSource>
データを選択するためにデータベース コマンドを指定する必要はありません。
データを表示するコントロールの追加
これで、DetailsView コントロールを追加し、LinqDataSource コントロールにバインドできるようになりました。DetailsView コントロールを使用すると、LinqDataSource コントロールによって管理されるデータを表示できます。
LinqDataSource から DetailsView にデータを接続するには
ツールボックスの [データ] タブで、DetailsView コントロールをダブルクリックしてページに追加します。
ID プロパティは DetailsView1 のままにしておくことができます。
DataSourceID プロパティを LinqDataSource1 に設定します。
DataKeyNames プロパティを MovieID に設定します。
AllowPaging を true に設定します。
DetailsView コントロールの宣言マークアップの例を次に示します。
<asp:DetailsView DataSourceID="LinqDataSource1" DataKeyNames="MovieID" AllowPaging="true" ID="DetailsView1" runat="server"> </asp:DetailsView>
変更内容を保存し、Ctrl キーを押しながら F5 キーを押して、ブラウザでページを表示します。
DetailsView コントロールには、MovieReviews テーブルの現在のレコードの値が表示されます。DetailsView コントロールにより、データベース テーブルの各列を表示する Web コントロールが自動的に作成されます。
ユーザーによるデータの更新、挿入、および削除の有効化
LinqDataSource コントロールは、データの更新、挿入、および削除を行うためのコマンドを作成できます。
更新、挿入、および削除の各操作を有効にするには
EnableDelete コントロールで、LinqDataSource、EnableUpdate、および EnableInsert の各プロパティを true に設定します。
LinqDataSource コントロールの宣言マークアップの例を次に示します。
<asp:LinqDataSource ContextTypeName="ReviewsDataContext" TableName="MovieReviews" AutoPage="true" EnableUpdate="true" EnableInsert="true" EnableDelete="true" ID="LinqDataSource1" runat="server"> </asp:LinqDataSource>
AutoGenerateDeleteButton コントロールで、DetailsView、AutoGenerateEditButton、および AutoGenerateInsertButton の各プロパティを true に設定します。
DetailsView コントロールに表示されるフィールドを制限し、フィールドの順序を設定するには、AutoGenerateRows プロパティを false に設定します。
Title、Theater、Rating、および Review の各列のフィールドを追加し、対応するデータ フィールドにバインドします。
DetailsView コントロールの宣言マークアップの例を次に示します。
<asp:DetailsView DataSourceID="LinqDataSource1" DataKeyNames="MovieID" AutoGenerateRows="false" AutoGenerateEditButton="true" AutoGenerateInsertButton="true" AutoGenerateDeleteButton="true" AllowPaging="true" ID="DetailsView1" runat="server"> <Fields> <asp:BoundField HeaderText="Title" DataField="Title" /> <asp:BoundField HeaderText="Theater" DataField="Theater" /> <asp:BoundField HeaderText="Number of Stars" DataField="Score" /> <asp:BoundField HeaderText="Review" DataField="Review" /> </Fields> </asp:DetailsView>
MovieID 列は、他の列と共にデータ ソースから選択されます。ただし、DetailsView コントロールには表示されないため、ユーザーはその値を変更することはできません。LinqDataSource コントロールがデータの更新、挿入、および削除を行うためのコマンドを自動的に作成できるようにするには、MovieID プロパティを選択する必要があります。
これらのデータ操作のコマンドを指定する必要はありません。
変更内容を保存し、Ctrl キーを押しながら F5 キーを押して、ブラウザでページを表示します。
DetailsView コントロールに、MovieReviews テーブルの現在のレコードのフィールドが表示されます。DetailsView コントロールの対応するボタンをクリックすると、レコードを更新、挿入、および削除できます。
次の手順
このチュートリアルでは、LinqDataSource コントロールを使用してレコードの更新、挿入、および削除を行う基本機能について説明しました。LinqDataSource コントロールのその他の機能を調べるために、次の操作を行うことができます。
Where プロパティの値を指定することで、返されるデータ レコードをフィルタ処理できます。Select プロパティの値を指定することで、列のサブセットのみを選択することもできます。詳細については、「チュートリアル : LinqDataSource コントロールと GridView コントロールを使用したデータのサブセットの選択およびフィルタ処理」を参照してください。
Web ページが読み取った後にデータベース内のデータが変更されていないことを確認するために、LinqDataSource コントロールは選択されたすべてのデータの元の値を保存します。更新が Web サーバーにポストされると、LinqDataSource オブジェクトは、保存された各フィールドとデータベース内の現在の値を比較します。一致する場合 (レコードが変更されていないことを示します)、LinqDataSource オブジェクトはレコードを更新または削除します。元の列の値をすべて保存するのは非効率です。この問題を回避するには、データベース テーブルに timestamp 列を追加します。詳細については、「チュートリアル : LinqDataSource コントロールでのタイムスタンプを使用したデータの整合性のチェック」を参照してください。