方法 : LinqDataSource コントロールを使用してデータを更新、挿入、および削除する

更新 : 2007 年 11 月

LinqDataSource コントロールを使用すると、ユーザーがデータを更新、挿入、および削除できる Web ページを作成できます。SQL コマンドを指定する必要はありません。これは、LinqDataSource コントロールでは、これらの操作に動的に作成されたコマンドが使用されるためです。ユーザーがデータを変更できるように、LinqDataSource コントロールで更新、挿入、または削除の各操作を有効にします。次に、DetailsView コントロールや GridView コントロールなど、ユーザーがデータを更新できるデータ バインド コントロールにコントロールを接続します。値が更新されるようにカスタマイズする場合は、パラメータの追加またはイベント ハンドラの作成により、値を動的に変更します。

ここでは、LinqDataSource コントロールを使用して更新、挿入、および削除の各操作を自動的に有効にする方法について説明します。また、更新される値をカスタマイズする方法についても説明します。さらに、データベース レコードを挿入または更新する前に、プログラムによってプロパティを設定するためのイベント ハンドラを作成する方法についても説明します。

自動的な更新、挿入、および削除の各操作を有効にする手順は似ています。このトピックの手順では、3 つの機能をすべて有効にする方法について説明します。ただし、3 つすべてを有効にする必要はありません。必要な機能だけを有効にすることもできます。

LinqDataSource コントロールに慣れていない場合は、「LinqDataSource Web サーバー コントロールの概要」および「チュートリアル : LinqDataSource コントロールと DetailsView コントロールを使用したデータの取得、更新、挿入、および削除」を参照してください。

データの自動的な更新、挿入、および削除

LinqDataSource コントロールがデータ更新を自動的に処理できるようにするには、次の設定が必要です。

データの更新、挿入、および削除を有効にするには

  1. ASP.NET Web ページに LinqDataSource コントロールを追加します。

  2. ContextTypeName プロパティを、DataContext クラスから派生するオブジェクトの名前に設定します。

    Visual Studio 2008 で Object Relationship Designer を使用して SQL データベース テーブルを表すクラスを作成すると、生成されたクラスは DataContext から自動的に派生します。

  3. TableName を、関連付けられたデータベース テーブルを表すエンティティ クラスの名前に設定します。

  4. LinqDataSource コントロールの EnableUpdateEnableDelete、および EnableInsert の各プロパティを true に設定します。

  5. DetailsView コントロールなどのデータ バインド コントロールを追加し、その DataSourceID プロパティを LinqDataSource コントロールの ID に設定します。

  6. データ コントロールの DataKeyNames プロパティを、テーブルの主キー列の名前に設定します。

  7. ユーザーのデータ バインド コントロールで更新、削除、または編集の各モードに切り替える方法を提供します。

    たとえば、データ バインド コントロールにボタンを追加したり、コントロールがそのボタンを自動的に作成できるようにしたりできます。

    次の例では、LinqDataSource コントロールおよび DetailsView コントロールを含む ASP.NET Web ページの一部の宣言マークアップを示します。コントロールは、ユーザーが Products という名前のテーブル内のデータを表示、更新、挿入、および削除できるように構成されます。

    <asp:LinqDataSource
      ContextTypeName="ExampleDataContext"
      TableName="Products"
      EnableUpdate="true"
      EnableInsert="true"
      EnableDelete="true"
      ID="LinqDataSource1"
      runat="server">
    </asp:LinqDataSource>
    <asp:DetailsView
      DataSourceID="LinqDataSource1"
      DataKeyNames="ProductID"
      AutoGenerateEditButton="true"
      AutoGenerateDeleteButton="true"
      AutoGenerateInsertButton="true"
      AllowPaging="true"
      ID="DetailsView1"
      runat="server">
    </asp:DetailsView>
    

データを更新、挿入、または削除するためのパラメータの追加

既定では、データを更新、挿入、または削除するためのパラメータを追加する必要はありません。データ バインド コントロールは LinqDataSource コントロールに値を渡し、LinqDataSource コントロールはその値を使用して対応するプロパティを設定します。LINQ to SQL により、データ ソースを変更するためのコマンドが作成されます。詳細については、「LINQ to SQL」を参照してください。

更新、挿入、または削除の各操作のパラメータを指定できます。この指定は、既定値を設定する場合、または空の文字列値を null に変換するかどうかを定義する場合に行います。更新または挿入される各値にパラメータを指定する必要はありません。カスタマイズする値にのみパラメータを指定します。パラメータによって定義されない値は、LinqDataSource コントロールによって自動的に処理されます。

LinqDataSource コントロールには、パラメータを管理するための UpdateParametersInsertParameters、および DeleteParameters の各コレクションが含まれます。

データを更新、挿入、および削除するためのパラメータを追加するには

  • 変更する各値のパラメータ定義を追加します。

    Category という名前のプロパティのパラメータを追加する方法の例を次に示します。パラメータは、UpdateParameters コレクションと InsertParameters コレクションの両方に追加されます。

    <asp:LinqDataSource
      ContextTypeName="ExampleDataContext"
      TableName="Products"
      EnableUpdate="true"
      EnableInsert="true"
      EnableDelete="true"
      ID="LinqDataSource1"
      runat="server">
      <UpdateParameters>
        <asp:Parameter Name="Category" DefaultValue="Miscellaneous" />
      </UpdateParameters>
      <InsertParameters>
        <asp:Parameter Name="Category" DefaultValue="Miscellaneous" />
      </InsertParameters>
    </asp:LinqDataSource>
    

    ユーザーが Category プロパティに値を指定しない場合は、既定値がデータベースに保存されます。

プログラムによる値の設定

データ操作が実行される前に、プログラムによってプロパティを設定するには、LinqDataSource コントロールの InsertingUpdating、および Deleting の各イベントのイベント ハンドラを作成します。ユーザーがイベント ハンドラで設定しないプロパティは、LinqDataSource コントロールによって自動的に設定されます。

プログラムによって値を設定するには

  1. LinqDataSource コントロールの InsertingUpdating、または Deleting の各イベントのイベント ハンドラを作成します。

  2. 変更する値をプログラムによって設定するイベント ハンドラにコードを追加します。

    更新、挿入、または削除するデータは、次のプロパティにあります。

    イベント

    プロパティ

    クラス

    Inserting

    NewObject

    LinqDataSourceInsertEventArgs

    Updating

    NewObject

    OriginalObject

    LinqDataSourceUpdateEventArgs

    Deleting

    OriginalObject

    LinqDataSourceDeleteEventArgs

    これらのプロパティはすべて、Object 型のオブジェクトを返します。これらのプロパティから返されたオブジェクトを、データを表すエンティティ クラスの型にキャストできます。キャストの後、その型のプロパティを設定できます。

    次の例では、DateModified 列を現在の日付と時刻に設定する Inserting イベントのイベント ハンドラを示します。またこの例では、NewObject プロパティ内のオブジェクトを Product 型にキャストします。

    Protected Sub LinqDataSource_Inserting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.LinqDataSourceInsertEventArgs)
        Dim product As Product
        product = CType(e.NewObject, Product)
        product.DateModified = DateTime.Now
    End Sub
    
    protected void LinqDataSource_Inserting(object sender, LinqDataSourceInsertEventArgs e)
    {
        Product product = (Product)e.NewObject;
        product.DateModified = DateTime.Now;
    }
    

    次の例では、LinqDataSource_Inserting メソッドを Inserting イベントにバインドする LinqDataSource コントロールの宣言マークアップを示します。

    <asp:LinqDataSource
      ContextTypeName="ExampleDataContext"
      TableName="Products"
      OnInserting="LinqDataSource_Inserting"
      EnableUpdate="true"
      EnableInsert="true"
      EnableDelete="true"
      ID="LinqDataSource1"
      runat="server">
    </asp:LinqDataSource>
    

コードのコンパイル方法

LinqDataSource コントロールを使用してデータを更新、挿入、または削除するには、データベース テーブルを表すエンティティ クラスを作成する必要があります。Visual Studio 2008 で Object Relationship Designer を使用することでエンティティ クラスを作成できます。

セキュリティ

この例には、ユーザー入力を受け付けるテキスト ボックスがあります。これにより、セキュリティが脆弱になる可能性があります。既定では、ASP.NET Web ページは、ユーザー入力にスクリプトまたは HTML 要素が含まれていないことを検証します。詳細については、「スクリプトによる攻略の概要」を参照してください。

接続文字列の格納方法については、「方法 : データ ソース コントロールを使用するときに接続文字列をセキュリティ保護する」を参照してください。

エラー メッセージに機密情報を表示しないようにする方法については、「方法 : 安全なエラー メッセージを表示する」を参照してください。

参照

概念

LinqDataSource Web サーバー コントロールの概要

参照

Parameter