SqlDataSource でオプティミスティック同時実行制御を実装する (VB)

作成者: Scott Mitchell

PDF のダウンロード

このチュートリアルでは、オプティミスティック コンカレンシー コントロールの要点を確認し、SqlDataSource コントロールを使用して実装する方法について説明します。

はじめに

前のチュートリアルでは、SqlDataSource コントロールに機能の挿入、更新、および削除を追加する方法について説明しました。 つまり、これらの機能を提供するには、コントロールの InsertCommandUpdateCommand、、または の各プロパティに対応する INSERTUPDATE、または DELETEDeleteCommand SQL ステートメントを、および DeleteParameters コレクション内の適切なパラメーターと共にUpdateParametersInsertParameters指定する必要があります。 これらのプロパティとコレクションは手動で指定できますが、データ ソースの構成ウィザードの [詳細設定] ボタンには、ステートメントに基づいてこれらのステートメントを自動的に作成する [生成 INSERT] UPDATE、[、および DELETE ステートメント] チェック ボックスが SELECT 用意されています。

[ステートメントの生成INSERTUPDATE]、および DELETE [SQL 生成オプションの詳細] ダイアログ ボックスには、[オプティミスティック コンカレンシーを使用する] オプションが表示されます (図 1 を参照)。 オンにすると、 WHERE 自動生成 UPDATE された ステートメントおよび DELETE ステートメントの句は、ユーザーが最後にデータをグリッドに読み込んでから基になるデータベース データが変更されていない場合にのみ、更新または削除を実行するように変更されます。

[高度な SQL 生成オプション] ダイアログ ボックスからオプティミスティック コンカレンシーのサポートを追加できます

図 1: [高度な SQL 生成オプション] ダイアログ ボックスからオプティミスティック 同時実行制御のサポートを追加できます

オプ ティミスティック コンカレンシーの実装 に関するチュートリアルに戻り、オプティミスティック コンカレンシー制御の基礎と、それを ObjectDataSource に追加する方法について説明しました。 このチュートリアルでは、オプティミスティック コンカレンシー制御の要点に触れ、SqlDataSource を使用して実装する方法について説明します。

オプティミスティック コンカレンシーの要約

複数の同時ユーザーが同じデータを編集または削除できる Web アプリケーションの場合、あるユーザーが誤って別の変更を上書きする可能性があります。 オプ ティミスティック コンカレンシーの実装に関する チュートリアルでは、次の例を示しました。

Jisun と Sam の 2 人のユーザーが、GridView コントロールを使用して製品を更新および削除できるアプリケーションのページにアクセスしていたとします。 どちらも、Chai の [編集] ボタンを同時にクリックします。 製品名をチャイティーに変更し、[更新] ボタンをクリックします。 結果は UPDATE データベースに送信されるステートメントであり、製品 のすべての 更新可能なフィールドが設定されます (Jisun が更新したフィールド ProductNameは 1 つだけですが)。 この時点で、データベースには、この特定の製品の値チャイティー、カテゴリ飲料、サプライヤーエキゾチックリキッドなどが含まれています。 ただし、Sam 画面の GridView には、編集可能な GridView 行に Chai という製品名が表示されます。 Jisun の変更がコミットされてから数秒後、Sam はカテゴリを Condiments に更新し、[更新] をクリックします。 その結果、製品名を UPDATE Chai に設定するステートメントがデータベースに送信され、 CategoryID は対応する Condiments カテゴリ ID に設定されます。 製品名に対する Jisun の変更が上書きされました。

図 2 は、この相互作用を示しています。

2 人のユーザーがレコードを同時に更新すると、1 人のユーザーが他のユーザーを上書きする可能性があります

図 2: 2 人のユーザーがレコードを同時に更新すると、1 人のユーザーが他のユーザーを上書きするように変更される可能性があります (フルサイズの画像を表示する をクリックします)

このシナリオが展開されないようにするには、 コンカレンシー 制御 の形式を実装する必要があります。 オプティミスティック コンカレンシー このチュートリアルの焦点は、コンカレンシーの競合が発生するたびに発生する可能性がある一方で、このような競合が発生しない時間の大部分が発生しないという前提で機能します。 したがって、競合が発生した場合、オプティミスティック コンカレンシー制御は、別のユーザーが同じデータを変更したため、変更を保存できないことをユーザーに通知するだけです。

注意

コンカレンシーの競合が多い、またはこのような競合が許容できない場合は、代わりにペシミスティック コンカレンシー制御を使用できます。 ペシミスティック コンカレンシー制御の詳細については、 オプティミスティック コンカレン シーの実装に関するチュートリアルを参照してください。

オプティミスティック コンカレンシー制御は、更新または削除されるレコードの値が、更新または削除プロセスの開始時と同じであることを確認することで機能します。 たとえば、編集可能な GridView で [編集] ボタンをクリックすると、レコードの値がデータベースから読み取られ、TextBoxes やその他の Web コントロールに表示されます。 これらの元の値は GridView によって保存されます。 後で、ユーザーが変更を加えて [更新] ボタンをクリックした後、使用するステートメントでは、 UPDATE 元の値と新しい値を考慮し、ユーザーが編集を開始した元の値がデータベース内の値と同じ場合にのみ、基になるデータベース レコードを更新する必要があります。 図 3 は、この一連のイベントを示しています。

更新または削除が成功するには、元の値が現在のデータベース値と等しい必要があります

図 3: Update または Delete to Succeed の場合、元の値は現在のデータベース値と等しい必要があります (フルサイズの画像を表示するには、ここをクリックします)

オプティミスティック コンカレンシーを実装するには、さまざまな方法があります (いくつかのオプションを簡単に確認するには 、Peter A. Brombergオプティミスティック コンカレンシー更新ロジック を参照してください)。 SqlDataSource (およびデータ アクセス層で使用される ADO.NET 型指定されたデータセット) によって使用される手法では、 句がWHERE拡張され、元のすべての値の比較が含まれます。 たとえば、次 UPDATE のステートメントは、現在のデータベース値が GridView のレコードを更新するときに最初に取得された値と等しい場合にのみ、製品の名前と価格を更新します。 @ProductNameパラメーターと @UnitPrice パラメーターには、ユーザーが入力した新しい値が含まれます。一方@original_ProductName@original_UnitPrice、[編集] ボタンがクリックされたときに GridView に最初に読み込まれた値が含まれます。

UPDATE Products SET
    ProductName = @ProductName,
    UnitPrice = @UnitPrice
WHERE
    ProductID = @original_ProductID AND
    ProductName = @original_ProductName AND
    UnitPrice = @original_UnitPrice

このチュートリアルで説明するように、SqlDataSource でオプティミスティック コンカレンシー制御を有効にすることは、チェック ボックスをオンにするだけで簡単です。

手順 1: オプティミスティック コンカレンシーをサポートする SqlDataSource の作成

まず、フォルダーからページをSqlDataSourceOptimisticConcurrency.aspxきます。 SqlDataSource コントロールをツールボックスから Designer にドラッグし、そのプロパティを IDProductsDataSourceWithOptimisticConcurrency設定します。 次に、コントロールのスマート タグから [データ ソースの構成] リンクをクリックします。 ウィザードの最初の画面で、 を操作することを選択し NORTHWINDConnectionString 、[次へ] をクリックします。

NORTHWINDConnectionString の操作を選択する

図 4: を操作することを選択します NORTHWINDConnectionString (クリックするとフルサイズの画像が表示されます)

この例では、ユーザーがテーブルを編集できるようにする GridView を Products 追加します。 したがって、[ステートメントの選択の構成] 画面で、ドロップダウン リストからテーブルをProducts選択し、図 5 に示すように 、および Discontinued 列を選択ProductIDProductNameUnitPriceします。

Products テーブルから、ProductID、ProductName、UnitPrice、および廃止された列を返します

図 5: テーブルからProducts、および Discontinued 列をUnitPriceProductIDProductName返します (フルサイズの画像を表示するには、ここをクリックします)

列を選択したら、[詳細設定] ボタンをクリックして[SQL 生成の詳細オプション] ダイアログ ボックスを表示します。 [Generate INSERT,, UPDATE, and DELETE statements]\(オプティミスティック コンカレンシーを使用する\) チェックボックスをオンにし、[OK] をクリックします (スクリーンショットについては、図 1 を参照してください)。 [次へ]、[完了] の順にクリックして、ウィザードを完了します。

データ ソースの構成ウィザードが完了したら、少し時間を取って、結果の DeleteCommand プロパティと UpdateCommand プロパティ、および コレクションをDeleteParametersUpdateParameters調べます。 これを行う最も簡単な方法は、左下隅にある [ソース] タブをクリックして、ページの宣言型構文を表示することです。 次の値が UpdateCommand 表示されます。

UPDATE [Products] SET
     [ProductName] = @ProductName,
     [UnitPrice] = @UnitPrice,
     [Discontinued] = @Discontinued
WHERE
     [ProductID] = @original_ProductID AND
     [ProductName] = @original_ProductName AND
     [UnitPrice] = @original_UnitPrice AND
     [Discontinued] = @original_Discontinued

コレクション内の 7 つのパラメーターを使用します UpdateParameters

<asp:SqlDataSource ID="ProductsDataSourceWithOptimisticConcurrency"
    runat="server" ...>
    <DeleteParameters>
      ...
    </DeleteParameters>
    <UpdateParameters>
        <asp:Parameter Name="ProductName" Type="String" />
        <asp:Parameter Name="UnitPrice" Type="Decimal" />
        <asp:Parameter Name="Discontinued" Type="Boolean" />
        <asp:Parameter Name="original_ProductID" Type="Int32" />
        <asp:Parameter Name="original_ProductName" Type="String" />
        <asp:Parameter Name="original_UnitPrice" Type="Decimal" />
        <asp:Parameter Name="original_Discontinued" Type="Boolean" />
    </UpdateParameters>
    ...
</asp:SqlDataSource>

同様に、 DeleteCommand プロパティと DeleteParameters コレクションは次のようになります。

DELETE FROM [Products]
WHERE
     [ProductID] = @original_ProductID AND
     [ProductName] = @original_ProductName AND
     [UnitPrice] = @original_UnitPrice AND
     [Discontinued] = @original_Discontinued
<asp:SqlDataSource ID="ProductsDataSourceWithOptimisticConcurrency"
    runat="server" ...>
    <DeleteParameters>
        <asp:Parameter Name="original_ProductID" Type="Int32" />
        <asp:Parameter Name="original_ProductName" Type="String" />
        <asp:Parameter Name="original_UnitPrice" Type="Decimal" />
        <asp:Parameter Name="original_Discontinued" Type="Boolean" />
    </DeleteParameters>
    <UpdateParameters>
        ...
    </UpdateParameters>
    ...
</asp:SqlDataSource>

プロパティと DeleteCommand プロパティのUpdateCommand句をWHERE拡張する (および各パラメーター コレクションにパラメーターを追加する) だけでなく、[オプティミスティック コンカレンシーを使用する] オプションを選択すると、他の 2 つのプロパティが調整されます。

データ Web コントロールが SqlDataSource または Update()Delete() メソッドを呼び出すと、元の値が渡されます。 SqlDataSource の ConflictDetection プロパティが に CompareAllValues設定されている場合、これらの元の値が コマンドに追加されます。 プロパティは OldValuesParameterFormatString 、これらの元の値パラメーターに使用される名前付けパターンを提供します。 データ ソースの構成ウィザードでは、original_{0}を使用し、 プロパティとコレクションの各元のUpdateParametersUpdateCommandDeleteCommandDeleteParametersパラメーターに適宜名前を付けます。

注意

SqlDataSource コントロールの挿入機能を使用していないため、プロパティとそのInsertParametersコレクションを自由にInsertCommand削除してください。

値の正しい処理NULL

残念ながら、オプティミスティック コンカレンシーを使用する場合、データ ソースの構成ウィザードによって自動生成されたUPDATE拡張ステートメントと DELETE ステートメントは、値を含むNULLレコードでは機能しません。 その理由を確認するには、SqlDataSource の UpdateCommandを検討してください。

UPDATE [Products] SET
     [ProductName] = @ProductName,
     [UnitPrice] = @UnitPrice,
     [Discontinued] = @Discontinued
WHERE
     [ProductID] = @original_ProductID AND
     [ProductName] = @original_ProductName AND
     [UnitPrice] = @original_UnitPrice AND
     [Discontinued] = @original_Discontinued

テーブル内の列にはUnitPriceProducts値を含NULLめることができます。 特定のレコードに のUnitPrice値がある場合、NULL句のWHERE部分[UnitPrice] = @original_UnitPrice常に False に評価されます。これは常に False を返すからですNULL = NULL。 したがって、 および DELETE ステートメントWHERE句は更新または削除する行を返さないので、値をUPDATE含むNULLレコードは編集または削除できません。

注意

このバグは、2004 年 6 月に SqlDataSource で最初に Microsoft に報告されました 。正しくない SQL ステートメントが生成 され、次のバージョンの ASP.NET で修正される予定であると伝えられています。

これを修正するには、値を持つ可能性があるすべての列の および DeleteCommand プロパティの句UpdateCommandを手動で更新WHEREする必要がありますNULL。 一般に、次のように変更 [ColumnName] = @original_ColumnName します。

(
   ([ColumnName] IS NULL AND @original_ColumnName IS NULL)
     OR
   ([ColumnName] = @original_ColumnName)
)

この変更は、宣言型マークアップ、プロパティ ウィンドウの UpdateQuery または DeleteQuery オプション、またはデータ ソースの構成ウィザードの [カスタム SQL ステートメントまたはストアド プロシージャの指定] オプションの UPDATE タブと DELETE タブを使用して直接行うことができます。 ここでも、この変更は、値を含NULLむことができる と DeleteCommand s WHEREのすべての列にUpdateCommand対して行う必要があります。

この例にこれを適用すると、次の変更 UpdateCommandDeleteCommand 値が作成されます。

UPDATE [Products] SET
     [ProductName] = @ProductName,
     [UnitPrice] = @UnitPrice,
     [Discontinued] = @Discontinued
WHERE
     [ProductID] = @original_ProductID AND
     [ProductName] = @original_ProductName AND
     (([UnitPrice] IS NULL AND @original_UnitPrice IS NULL)
        OR ([UnitPrice] = @original_UnitPrice)) AND
     [Discontinued] = @original_Discontinued
DELETE FROM [Products]
WHERE
     [ProductID] = @original_ProductID AND
     [ProductName] = @original_ProductName AND
     (([UnitPrice] IS NULL AND @original_UnitPrice IS NULL)
        OR ([UnitPrice] = @original_UnitPrice)) AND
     [Discontinued] = @original_Discontinued

手順 2: 編集オプションと削除オプションを使用して GridView を追加する

オプティミスティック コンカレンシーをサポートするように SqlDataSource が構成されている場合、残っているのは、このコンカレンシー コントロールを利用するページにデータ Web コントロールを追加することです。 このチュートリアルでは、編集機能と削除機能の両方を提供する GridView を追加します。 これを実現するには、GridView をツールボックスからDesignerにドラッグし、 を に設定IDしますProducts。 GridView のスマート タグから、手順 1 で追加した ProductsDataSourceWithOptimisticConcurrency SqlDataSource コントロールにバインドします。 最後に、スマート タグから [編集を有効にする] オプションと [削除を有効にする] オプションをチェックします。

GridView を SqlDataSource にバインドし、編集と削除を有効にする

図 6: GridView を SqlDataSource にバインドし、編集と削除を有効にする (フルサイズの画像を表示する をクリックします)

GridView を追加した後、BoundField を削除ProductIDし、BoundField のHeaderTextプロパティを ProductName Product に変更し、そのプロパティが単に Price になるように BoundField を更新UnitPriceして、外観をHeaderText構成します。 理想的には、編集インターフェイスを拡張して、値の RequiredFieldValidator ProductName と値の CompareValidator UnitPrice を含めます (適切に書式設定された数値であることを確認するため)。 GridView の編集インターフェイスのカスタマイズの詳細については、 データ変更インターフェイス のカスタマイズに関するチュートリアルを参照してください。

注意

GridView から SqlDataSource に渡された元の値はビュー ステートに格納されるため、GridView のビュー ステートを有効にする必要があります。

GridView に対してこれらの変更を行った後、GridView および SqlDataSource 宣言型マークアップは次のようになります。

<asp:SqlDataSource ID="ProductsDataSourceWithOptimisticConcurrency"
    runat="server" ConflictDetection="CompareAllValues"
    ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
    DeleteCommand=
        "DELETE FROM [Products]
         WHERE [ProductID] = @original_ProductID
         AND [ProductName] = @original_ProductName
         AND (([UnitPrice] IS NULL AND @original_UnitPrice IS NULL)
              OR ([UnitPrice] = @original_UnitPrice))
         AND [Discontinued] = @original_Discontinued"
    OldValuesParameterFormatString=
        "original_{0}"
    SelectCommand=
        "SELECT [ProductID], [ProductName], [UnitPrice], [Discontinued]
         FROM [Products]"
    UpdateCommand=
        "UPDATE [Products]
         SET [ProductName] = @ProductName, [UnitPrice] = @UnitPrice,
            [Discontinued] = @Discontinued
         WHERE [ProductID] = @original_ProductID
         AND [ProductName] = @original_ProductName
         AND (([UnitPrice] IS NULL AND @original_UnitPrice IS NULL)
            OR ([UnitPrice] = @original_UnitPrice))
        AND [Discontinued] = @original_Discontinued">
    <DeleteParameters>
        <asp:Parameter Name="original_ProductID" Type="Int32" />
        <asp:Parameter Name="original_ProductName" Type="String" />
        <asp:Parameter Name="original_UnitPrice" Type="Decimal" />
        <asp:Parameter Name="original_Discontinued" Type="Boolean" />
    </DeleteParameters>
    <UpdateParameters>
        <asp:Parameter Name="ProductName" Type="String" />
        <asp:Parameter Name="UnitPrice" Type="Decimal" />
        <asp:Parameter Name="Discontinued" Type="Boolean" />
        <asp:Parameter Name="original_ProductID" Type="Int32" />
        <asp:Parameter Name="original_ProductName" Type="String" />
        <asp:Parameter Name="original_UnitPrice" Type="Decimal" />
        <asp:Parameter Name="original_Discontinued" Type="Boolean" />
    </UpdateParameters>
</asp:SqlDataSource>
<asp:GridView ID="Products" runat="server"
    AutoGenerateColumns="False" DataKeyNames="ProductID"
    DataSourceID="ProductsDataSourceWithOptimisticConcurrency">
    <Columns>
        <asp:CommandField ShowDeleteButton="True" ShowEditButton="True" />
        <asp:BoundField DataField="ProductName" HeaderText="Product"
            SortExpression="ProductName" />
        <asp:BoundField DataField="UnitPrice" HeaderText="Price"
            SortExpression="UnitPrice" />
        <asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued"
            SortExpression="Discontinued" />
    </Columns>
</asp:GridView>

オプティミスティック コンカレンシー コントロールの動作を確認するには、2 つのブラウザー ウィンドウを開き、両方でページを OptimisticConcurrency.aspx 読み込みます。 両方のブラウザーで最初の製品の [編集] ボタンをクリックします。 1 つのブラウザーで製品名を変更し、[更新] をクリックします。 ブラウザーはポストバックされ、GridView は編集前モードに戻り、編集したレコードの新しい製品名が表示されます。

2 番目のブラウザー ウィンドウで価格を変更し (ただし、製品名は元の値のままにします)、[更新] をクリックします。 ポストバックでは、グリッドは編集前モードに戻りますが、価格への変更は記録されません。 2 番目のブラウザーには、新しい製品名が古い価格の最初のブラウザーと同じ値が表示されます。 2 番目のブラウザー ウィンドウで行われた変更が失われました。 さらに、コンカレンシー違反が発生したことを示す例外やメッセージがないため、変更はかなり静かに失われました。

2 番目のブラウザー ウィンドウの変更がサイレント モードで失われました

図 7: 2 番目のブラウザー ウィンドウの変更がサイレント モードで失われました (クリックするとフルサイズの画像が表示されます)

2 番目のブラウザーの変更がコミットされなかった理由は、ステートメント s WHERE 句ですべてのレコードがフィルターで除外されたため、行に影響を与えなかったためですUPDATE。 ステートメントをもう UPDATE 一度見てみましょう。

UPDATE [Products] SET
     [ProductName] = @ProductName,
     [UnitPrice] = @UnitPrice,
     [Discontinued] = @Discontinued
WHERE
     [ProductID] = @original_ProductID AND
     [ProductName] = @original_ProductName AND
     (([UnitPrice] IS NULL AND @original_UnitPrice IS NULL) OR
        ([UnitPrice] = @original_UnitPrice)) AND
     [Discontinued] = @original_Discontinued

2 番目のブラウザー ウィンドウでレコードが更新されると、 句で WHERE 指定された元の製品名が既存の製品名と一致しません (最初のブラウザーによって変更されたため)。 したがって、 ステートメント [ProductName] = @original_ProductName は False を返し UPDATE 、 はレコードに影響しません。

注意

削除は同じ方法で機能します。 2 つのブラウザー ウィンドウを開いた状態で、まず、特定の製品を 1 つで編集してから、その変更を保存します。 一方のブラウザーで変更を保存した後、もう一方のブラウザーで同じ製品の [削除] ボタンをクリックします。 ステートメント s WHERE 句では元の値がDELETE一致しないため、削除は自動的に失敗します。

2 番目のブラウザー ウィンドウのエンド ユーザーの観点から、[更新] ボタンをクリックすると、グリッドは編集前モードに戻りますが、変更は失われました。 ただし、変更が反映されなかったという視覚的なフィードバックはありません。 理想的には、ユーザーの変更がコンカレンシー違反に失われた場合は、ユーザーに通知し、おそらくグリッドを編集モードに保ちます。 これを実現する方法を見てみましょう。

手順 3: コンカレンシー違反が発生したタイミングを判断する

コンカレンシー違反は行った変更を拒否するので、コンカレンシー違反が発生したときにユーザーに警告を出すのが良いでしょう。 ユーザーに警告するには、ラベル Web コントロールを という名前ConcurrencyViolationMessageTextのページの上部に追加します。そのプロパティには、次のメッセージが表示されます。別のユーザーによって同時に更新されたレコードを更新または削除しようとしました。 他のユーザーの変更を確認してから、更新または削除をやり直してください。 Label コントロールの CssClass プロパティを Warning に設定します。これは、 で定義されている CSS クラスで Styles.css 、テキストを赤、斜体、太字、および大きなフォントで表示します。 最後に、ラベルとVisibleEnableViewStateプロパティを に設定しますFalse。 これにより、明示的に プロパティTrueを に設定Visibleしたポストバックのみを除き、Label は非表示になります。

ラベル コントロールをページに追加して警告を表示する

図 8: 警告を表示するページにラベル コントロールを追加する (フルサイズの画像を表示する をクリックします)

更新または削除を実行すると、GridView とRowUpdatedRowDeletedイベント ハンドラーは、データ ソース管理が要求された更新または削除を実行した後に発生します。 これらのイベント ハンドラーから、操作によって影響を受けた行の数を確認できます。 0 行が影響を受けた場合は、ラベルを表示します ConcurrencyViolationMessage

イベントと RowDeleted イベントの両方のイベント ハンドラーをRowUpdated作成し、次のコードを追加します。

Protected Sub Products_RowUpdated(sender As Object, e As GridViewUpdatedEventArgs) _
    Handles Products.RowUpdated
    If e.AffectedRows = 0 Then
        ConcurrencyViolationMessage.Visible = True
        e.KeepInEditMode = True
        ' Rebind the data to the GridView to show the latest changes
        Products.DataBind()
    End If
End Sub
Protected Sub Products_RowDeleted(sender As Object, e As GridViewDeletedEventArgs) _
    Handles Products.RowDeleted
    If e.AffectedRows = 0 Then
        ConcurrencyViolationMessage.Visible = True
    End If
End Sub

どちらのイベント ハンドラーでも、 プロパティをe.AffectedRowsチェックし、0 に等しい場合は、Label s Visible プロパティを にTrue設定しますConcurrencyViolationMessageRowUpdatedイベント ハンドラーでは、 プロパティを true に設定して、GridView に編集モードをKeepInEditMode維持するように指示します。 これを行う場合は、他のユーザーのデータが編集インターフェイスに読み込まれるように、データをグリッドに再バインドする必要があります。 これを行うには、GridView の DataBind() メソッドを呼び出します。

図 9 に示すように、これら 2 つのイベント ハンドラーでは、コンカレンシー違反が発生するたびに非常に顕著なメッセージが表示されます。

コンカレンシー違反が発生した場合にメッセージが表示される

図 9: コンカレンシー違反の顔にメッセージが表示される (フルサイズの画像を表示する をクリックします)

まとめ

複数の同時ユーザーが同じデータを編集している可能性がある Web アプリケーションを作成する場合は、コンカレンシー制御オプションを検討することが重要です。 既定では、ASP.NET データ Web コントロールとデータ ソース コントロールでは、コンカレンシー制御は使用されません。 このチュートリアルで説明したように、SqlDataSource を使用したオプティミスティック コンカレンシー制御の実装は比較的迅速かつ簡単です。 SqlDataSource は、自動生成UPDATEされた WHERE ステートメントと DELETE ステートメントに拡張句を追加するためのほとんどの作業を処理しますが、「値の正しい処理」セクションで説明されているように、値列の処理NULLNULLにはいくつかの微妙な点があります。

このチュートリアルでは、SqlDataSource の調査を終了します。 残りのチュートリアルでは、ObjectDataSource と階層化アーキテクチャを使用したデータの操作に戻ります。

幸せなプログラミング!

著者について

7 冊の ASP/ASP.NET 書籍の著者であり、 4GuysFromRolla.com の創設者である Scott Mitchell は、1998 年から Microsoft Web テクノロジと協力しています。 Scott は独立したコンサルタント、トレーナー、ライターとして働いています。 彼の最新の本は サムズ・ティーチ・自分自身 ASP.NET 24時間で2.0です。 にアクセスmitchell@4GuysFromRolla.comすることも、ブログを介して アクセスすることもできます。これは でhttp://ScottOnWriting.NET確認できます。