Share via


JOIN を使用するように TableAdapter を更新する (VB)

作成者: Scott Mitchell

PDF のダウンロード

データベースを操作する場合は、複数のテーブルに分散されたデータを要求するのが一般的です。 2 つの異なるテーブルからデータを取得するには、相関サブクエリまたは JOIN 操作を使用できます。 このチュートリアルでは、関連付けられたサブクエリと JOIN 構文を比較してから、メイン クエリに JOIN を含む TableAdapter を作成する方法を確認します。

はじめに

リレーショナル データベースでは、作業に関心のあるデータは、多くの場合、複数のテーブルに分散されます。 たとえば、製品情報を表示する場合は、各製品の対応するカテゴリと仕入先の名前を一覧表示する必要があります。 テーブルには ProductsCategoryIDSupplierID の値がありますが、実際のカテゴリ名と仕入先名はそれぞれ テーブルと Suppliers テーブルにありますCategories

別の関連テーブルから情報を取得するには、 相関サブクエリ または JOINs を使用します。 相関サブクエリは、外部クエリの列を参照する入れ子になった SELECT クエリです。 たとえば、データ アクセス層の作成に関するチュートリアルでは、メイン クエリで 2 つの相関サブクエリをProductsTableAdapter使用して、各製品のカテゴリ名と仕入先名を返しました。 は JOIN 、2 つの異なるテーブルから関連する行をマージする SQL コンストラクトです。 SqlDataSource コントロールを使用したデータのクエリチュートリアルで を使用JOINして、各製品と共にカテゴリ情報を表示しました。

TableAdapters で s を使用 JOIN することを控えた理由は、TableAdapter ウィザードで対応する INSERTUPDATE、および DELETE ステートメントを自動生成する制限があるためです。 具体的には、TableAdapter の メイン クエリに が含JOINまれている場合、TableAdapter では、アドホック SQL ステートメントまたはストアド プロシージャを、その InsertCommandUpdateCommand、および DeleteCommand プロパティに対して自動的に作成することはできません。

このチュートリアルでは、相関サブクエリと s を簡単に比較して比較してから、JOINメイン クエリに を含む JOIN TableAdapter を作成する方法について説明します。

相関サブクエリと s の比較とJOIN コントラスト

ProductsTableAdapter DataSet の最初のチュートリアルで作成された は、相関サブクエリをNorthwind使用して、各製品の対応するカテゴリと仕入先名を取り戻します。 s ProductsTableAdapter メイン クエリを次に示します。

SELECT ProductID, ProductName, SupplierID, CategoryID, 
       QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, 
       ReorderLevel, Discontinued,
       (SELECT CategoryName FROM Categories WHERE Categories.CategoryID = 
            Products.CategoryID) as CategoryName, 
       (SELECT CompanyName FROM Suppliers WHERE Suppliers.SupplierID = 
            Products.SupplierID) as SupplierName
FROM Products

2 つの相関サブクエリ ( (SELECT CategoryName FROM Categories WHERE Categories.CategoryID = Products.CategoryID) および (SELECT CompanyName FROM Suppliers WHERE Suppliers.SupplierID = Products.SupplierID) ) は、 SELECT 外部 SELECT ステートメントの列リストの追加列として製品ごとに 1 つの値を返すクエリです。

または、 を JOIN 使用して、各製品の仕入先とカテゴリ名を返すことができます。 次のクエリは、上記と同じ出力を返しますが、サブクエリの代わりに を使用 JOIN します。

SELECT ProductID, ProductName, Products.SupplierID, Products.CategoryID, 
       QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, 
       ReorderLevel, Discontinued,
       Categories.CategoryName, 
       Suppliers.CompanyName as SupplierName
FROM Products
    LEFT JOIN Categories ON
        Categories.CategoryID = Products.CategoryID
    LEFT JOIN Suppliers ON
        Suppliers.SupplierID = Products.SupplierID

JOIN 、あるテーブルのレコードを、ある条件に基づいて別のテーブルのレコードとマージします。 たとえば、上記のクエリでは、 LEFT JOIN Categories ON Categories.CategoryID = Products.CategoryID は、各製品レコードを製品の値と一致CategoryIDするCategoryIDカテゴリ レコードとマージするようにSQL Serverに指示します。 マージされた結果により、各製品の対応するカテゴリ フィールド (など CategoryName) を操作できます。

注意

JOIN は、リレーショナル データベースからデータに対してクエリを実行する場合に一般的に使用されます。 構文をJOIN初めて使用する場合、またはその使用法を少しブラッシュアップする必要がある場合は、W3 SchoolsSQL Join チュートリアルをお勧めします。 また、SQL オンライン ブックJOIN「基礎」と「サブクエリの基礎」セクションも参照してください。

JOIN s と相関サブクエリは両方とも他のテーブルから関連データを取得するために使用できるため、多くの開発者は頭を悩み、使用する方法を疑問に思っています。 私が話したすべてのSQLの第一人者は、ほぼ同じことを言ったが、SQL Serverはほぼ同じ実行計画を作り出すので、パフォーマンスは本当に重要ではない。 その後、彼らのアドバイスは、あなたとあなたのチームが最も快適なテクニックを使用することです。 このアドバイスを与えた後、これらの専門家はすぐに相関サブクエリよりもsの JOIN 好みを表現することに注目してください。

型指定された DataSets を使用してデータ アクセスレイヤーを構築する場合、サブクエリを使用する場合はツールの動作が向上します。 特に、TableAdapter ウィザードでは、メイン クエリに がJOIN含まれている場合、対応する INSERTUPDATE、および DELETE ステートメントは自動生成されませんが、相関サブクエリを使用すると、これらのステートメントが自動生成されます。

この欠点を調べるには、 フォルダーに一時的な型指定された DataSet を ~/App_Code/DAL 作成します。 TableAdapter 構成ウィザードで、アドホック SQL ステートメントの使用を選択し、次 SELECT のクエリを入力します (図 1 を参照)。

SELECT ProductID, ProductName, Products.SupplierID, Products.CategoryID, 
       QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, 
       ReorderLevel, Discontinued,
       Categories.CategoryName, 
       Suppliers.CompanyName as SupplierName
FROM Products
    LEFT JOIN Categories ON
        Categories.CategoryID = Products.CategoryID
    LEFT JOIN Suppliers ON
        Suppliers.SupplierID = Products.SupplierID

JOIN を含むクエリが入力された TableAdaptor 構成ウィザード ウィンドウを示すスクリーンショット。

図 1: を含むメイン クエリを JOIN 入力します (クリックするとフルサイズの画像が表示されます)

既定では、TableAdapter は、メイン クエリに基づいて、および DELETE ステートメントを自動的に作成INSERTUPDATEします。 [詳細設定] ボタンをクリックすると、この機能が有効になっていることがわかります。 この設定にもかかわらず、TableAdapter は、メイン クエリに が含まれているため、、、UPDATEおよび DELETE ステートメントをJOIN作成INSERTできません。

[Insert, Update and Delete ステートメントの生成] チェックボックスがオンの [詳細オプション] ウィンドウを示すスクリーンショット。

図 2: を含むメイン クエリを JOIN 入力する

[完了] をクリックしてウィザードを終了します。 この時点で、DataSet のDesignerには、クエリの列リストに返されるSELECT各フィールドの列を含む DataTable を持つ単一の TableAdapter が含まれます。 これには、図 3 に CategoryName 示すように、 と SupplierNameが含まれます。

DataTable には、列リストに返される各フィールドの列が含まれます

図 3: DataTable には、列リストに返される各フィールドの列が含まれています

DataTable には適切な列が含まれていますが、TableAdapter には 、InsertCommandUpdateCommand、および DeleteCommand プロパティの値がありません。 これを確認するには、Designerで TableAdapter をクリックし、プロパティ ウィンドウに移動します。 そこで、、UpdateCommand、および DeleteCommand の各プロパティが (None) に設定されていることがわかりますInsertCommand

InsertCommand、UpdateCommand、および DeleteCommand プロパティは に設定されています (なし)

図 4: 、InsertCommandUpdateCommand、および DeleteCommand プロパティが に設定されている (なし) (フルサイズの画像を表示する をクリックします)

この欠点を回避するために、プロパティ ウィンドウを使用して、および プロパティの InsertCommandUpdateCommandSQL ステートメントとDeleteCommandパラメーターを手動で指定できます。 または、TableAdapter の メイン クエリを構成して、 を含JOINめないようにすることもできます。 これにより、INSERTUPDATEおよび DELETE ステートメントを自動的に生成できます。 ウィザードが完了したら、構文が含まれるように、プロパティ ウィンドウから TableAdapter をSelectCommand手動でJOIN更新できます。

この方法は機能しますが、アドホック SQL クエリを使用する場合は非常に脆弱です。TableAdapter の メイン クエリがウィザードを通じて再構成されるたびに、自動生成された INSERTUPDATE、および DELETE ステートメントが再作成されるためです。 つまり、後で行ったすべてのカスタマイズは、TableAdapter を右クリックし、コンテキスト メニューから [構成] を選択し、ウィザードをもう一度完了すると失われます。

TableAdapter の自動生成された INSERT、、 UPDATEおよび DELETE ステートメントの脆弱性は、幸いにもアドホック SQL ステートメントに限定されます。 TableAdapter でストアド プロシージャが使用されている場合は、ストアド プロシージャをカスタマイズSelectCommandInsertCommandUpdateCommandDeleteCommandし、ストアド プロシージャが変更されることを心配することなく TableAdapter 構成ウィザードを再実行できます。

次のいくつかの手順では、TableAdapter を作成します。最初は、対応する挿入、更新、および削除ストアド プロシージャが自動生成されるように、任意JOINの を省略するメイン クエリを使用します。 次に、 を SelectCommand 更新して、関連テーブルから追加の列を返す を JOIN 使用します。 最後に、対応するビジネス ロジック レイヤー クラスを作成し、ASP.NET Web ページで TableAdapter を使用する方法について説明します。

手順 1: 簡略化されたメイン クエリを使用して TableAdapter を作成する

このチュートリアルでは、DataSet のテーブルに TableAdapter と厳密に型指定された DataTable EmployeesNorthwindWithSprocs 追加します。 Employeesテーブルには、ReportsTo従業員の上司の をEmployeeID指定したフィールドが含まれています。 たとえば、従業員の Anne Dodsworth の値は ReportToEmployeeID 5 で、これはスティーブン・ブキャナンの です。 その結果、アンはマネージャーのスティーブンに報告します。 各従業員の ReportsTo 値を報告するだけでなく、上司の名前を取得することもできます。 これは、 を使用して JOIN実現できます。 ただし、TableAdapter を最初に作成するときに を使用 JOIN すると、ウィザードで対応する挿入、更新、および削除の機能が自動的に生成されなくなります。 そのため、まず、メイン クエリに が含JOINまれていない TableAdapter を作成します。 次に、手順 2 では、メインクエリ ストアド プロシージャを更新して、 を使用してマネージャーの名前をJOIN取得します。

まず、フォルダー内の NorthwindWithSprocs DataSet を ~/App_Code/DAL 開きます。 Designerを右クリックし、コンテキスト メニューから [追加] オプションを選択し、[TableAdapter] メニュー項目を選択します。 これにより、TableAdapter 構成ウィザードが起動します。 図 5 に示すように、ウィザードで新しいストアド プロシージャを作成し、[次へ] をクリックします。 TableAdapter ウィザードから新しいストアド プロシージャを作成する際のリフレッシャーについては、「 Typed DataSet s TableAdapters の新しいストアド プロシージャの作成 」チュートリアルを参照してください。

[新しいストアド プロシージャの作成] オプションを選択します

図 5: [新しいストアド プロシージャの作成] オプションを選択します (クリックするとフルサイズの画像が表示されます)

TableAdapter の メイン クエリには、次SELECTのステートメントを使用します。

SELECT EmployeeID, LastName, FirstName, Title, HireDate, ReportsTo, Country
FROM Employees

このクエリには が含JOINまれていないため、TableAdapter ウィザードは、対応する INSERTUPDATE、および DELETE ステートメントを含むストアド プロシージャと、メイン クエリを実行するためのストアド プロシージャを自動的に作成します。

次の手順では、TableAdapter のストアド プロシージャに名前を付けます。 図 6 に示すように、、Employees_InsertEmployees_Update、および Employees_Deleteの名前Employees_Selectを使用します。

TableAdapter のストアド プロシージャに名前を付けます

図 6: TableAdapter のストアド プロシージャに名前を付ける (クリックするとフルサイズの画像が表示されます)

最後の手順では、TableAdapter のメソッドに名前を付けるよう求められます。 メソッド名として と GetEmployees を使用Fillします。 また、[Create methods to send updates to the database (GenerateDBDirectMethods)] チェック ボックスはオンのままにしてください。

TableAdapter のメソッドに Fill と GetEmployees という名前を付けます

図 7: TableAdapter のメソッドに名前を Fill 付け GetEmployees 、(クリックするとフルサイズの画像が表示されます)

ウィザードが完了したら、少し時間を取ってデータベース内のストアド プロシージャを調べます。 、および Employees_Deleteの 4 つの新しいものEmployees_UpdateEmployees_SelectEmployees_Insertが表示されます。 次に、 を EmployeesDataTable 調べて、作成し EmployeesTableAdapter たばかりの状態にします。 DataTable には、メイン クエリによって返される各フィールドの列が含まれています。 TableAdapter をクリックし、プロパティ ウィンドウに移動します。 そこで、、、および DeleteCommand の各プロパティが、対応するストアド プロシージャを呼び出すように正しく構成されていることがわかります。InsertCommandUpdateCommand

TableAdapter には、挿入、更新、および削除の機能が含まれます

図 8: TableAdapter には、挿入、更新、および削除の機能が含まれています (フルサイズの画像を表示する 場合はクリックします)

挿入、更新、および削除ストアド プロシージャが自動的に作成され InsertCommand、、、 UpdateCommandおよび DeleteCommand プロパティが正しく構成された状態で、各従業員のマネージャーに関する追加情報を返すように、ストアド プロシージャをカスタマイズ SelectCommand する準備ができました。 具体的には、 を使用JOINしてマネージャーの と FirstNameLastName の値をEmployees_Select返すようにストアド プロシージャを更新する必要があります。 ストアド プロシージャが更新されたら、これらの追加の列が含まれるように DataTable を更新する必要があります。 手順 2 と 3 では、これら 2 つのタスクに取り組みます。

手順 2: ストアド プロシージャをカスタマイズして を含めるJOIN

まず、サーバー エクスプローラーに移動し、Northwind データベースの [ストアド プロシージャ] フォルダーにドリルダウンし、ストアド プロシージャをEmployees_Select開きます。 このストアド プロシージャが表示されない場合は、[ストアド プロシージャ] フォルダーを右クリックし、[更新] を選択します。 ストアド プロシージャを更新して、 を使用 LEFT JOIN してマネージャーの姓と名を返すようにします。

SELECT Employees.EmployeeID, Employees.LastName, 
       Employees.FirstName, Employees.Title, 
       Employees.HireDate, Employees.ReportsTo, 
       Employees.Country,
       Manager.FirstName as ManagerFirstName, 
       Manager.LastName as ManagerLastName
FROM Employees
    LEFT JOIN Employees AS Manager ON
        Employees.ReportsTo = Manager.EmployeeID

ステートメントを更新した SELECT 後、[ファイル] メニューの [保存] を選択して変更を保存します Employees_Select。 または、ツール バーの [保存] アイコンをクリックするか、Ctrl + S キーを押します。 変更を保存した後、Server エクスプローラーでストアド プロシージャを右クリックEmployees_Selectし、[実行] を選択します。 これにより、ストアド プロシージャが実行され、その結果が [出力] ウィンドウに表示されます (図 9 を参照)。

ストアド プロシージャの結果が [出力] ウィンドウに表示されます

図 9: ストアド プロシージャの結果が [出力] ウィンドウに表示される (フルサイズの画像を表示する をクリックします)

手順 3: DataTable の列を更新する

この時点で、ストアド プロシージャは Employees_SelectManagerLastName の値をManagerFirstName返しますがEmployeesDataTable、 にはこれらの列がありません。 これらの不足している列は、次の 2 つの方法のいずれかで DataTable に追加できます。

  • 手動 - DataSet Designerで DataTable を右クリックし、[追加] メニューから [列] を選択します。 その後、列に名前を付け、それに応じてプロパティを設定できます。
  • 自動的 に - TableAdapter 構成ウィザードは、ストアド プロシージャによって返されるフィールドを反映するように DataTable の列を SelectCommand 更新します。 アドホック SQL ステートメントを使用する場合、 には が含まれるJOINようになったためSelectCommand、、、および DeleteCommand の各プロパティも削除InsertCommandUpdateCommandされます。 ただし、ストアド プロシージャを使用する場合、これらのコマンド プロパティはそのまま残ります。

前のチュートリアルでは、DataTable 列を手動で追加する方法について説明しました。たとえば、 マスター/詳細 詳細データ リストを含むマスター レコードの箇条書きの使用ファイルのアップロードなどです。このプロセスについては、次のチュートリアルでもう一度詳しく説明します。 ただし、このチュートリアルでは、TableAdapter 構成ウィザードを使用して自動アプローチを使用してみましょう。

まず、 を EmployeesTableAdapter 右クリックし、コンテキスト メニューから [構成] を選択します。 これにより、TableAdapter 構成ウィザードが表示されます。このウィザードには、選択、挿入、更新、削除に使用されるストアド プロシージャと、戻り値とパラメーター (存在する場合) が一覧表示されます。 図 10 は、このウィザードを示しています。 ここでは、ストアド プロシージャが Employees_Select フィールドと ManagerLastName フィールドをManagerFirstName返すようになったことがわかります。

Employees_Select ストアド プロシージャの更新された列リストがウィザードに表示されます

図 10: ウィザードは、ストアド プロシージャの更新された列の一覧を Employees_Select 表示します (フルサイズの画像を表示する をクリックします)

[完了] をクリックしてウィザードを完了します。 DataSet Designerに戻ると、 EmployeesDataTable には と の 2 つの列が追加されます ManagerFirstNameManagerLastName

EmployeesDataTable に 2 つの新しい列が含まれている

図 11: EmployeesDataTable 2 つの新しい列が含まれています (フルサイズの画像を表示する場合はクリックします)

更新 Employees_Select されたストアド プロシージャが有効であり、TableAdapter の挿入、更新、削除の機能がまだ機能していることを示すために、ユーザーが従業員を表示および削除できる Web ページを作成してみましょう。 ただし、このようなページを作成する前に、DataSet の従業員を操作するために、まずビジネス ロジック レイヤーに新しいクラスを作成する NorthwindWithSprocs 必要があります。 手順 4 では、クラスを作成します EmployeesBLLWithSprocs 。 手順 5 では、ASP.NET ページからこのクラスを使用します。

手順 4: ビジネス ロジック レイヤーの実装

という名前EmployeesBLLWithSprocs.vbのフォルダーに新しいクラス ファイルを~/App_Code/BLL作成します。 このクラスは既存EmployeesBLLのクラスのセマンティクスを模倣します。この新しいクラスのみが提供するメソッドが少なく、DataSet ではなく Northwind DataSet を使用NorthwindWithSprocsします。 次のコードを EmployeesBLLWithSprocs クラスに追加します。

Imports NorthwindWithSprocsTableAdapters
<System.ComponentModel.DataObject()> _
Public Class EmployeesBLLWithSprocs
    Private _employeesAdapter As EmployeesTableAdapter = Nothing
    Protected ReadOnly Property Adapter() As EmployeesTableAdapter
        Get
            If _employeesAdapter Is Nothing Then
                _employeesAdapter = New EmployeesTableAdapter()
            End If
            Return _employeesAdapter
        End Get
    End Property
    <System.ComponentModel.DataObjectMethodAttribute _
        (System.ComponentModel.DataObjectMethodType.Select, True)> _
    Public Function GetEmployees() As NorthwindWithSprocs.EmployeesDataTable
        Return Adapter.GetEmployees()
    End Function
    <System.ComponentModel.DataObjectMethodAttribute _
        (System.ComponentModel.DataObjectMethodType.Delete, True)> _
    Public Function DeleteEmployee(ByVal employeeID As Integer) As Boolean
        Dim rowsAffected = Adapter.Delete(employeeID)
        'Return true if precisely one row was deleted, otherwise false
        Return rowsAffected = 1
    End Function
End Class

クラス s プロパティはEmployeesBLLWithSprocs、DataSet の EmployeesTableAdapterインスタンスをNorthwindWithSprocsAdapterします。 これは、 クラスと GetEmployeesDeleteEmployee メソッドによって使用されます。 メソッドはGetEmployees、 に対応する GetEmployees メソッドをEmployeesTableAdapter呼び出します。このメソッドはストアド プロシージャをEmployees_Select呼び出し、その結果を に設定しますEmployeeDataTable。 メソッドも DeleteEmployee 同様に、 ストアド プロシージャを EmployeesTableAdapter 呼び出す s Delete メソッドを Employees_Delete 呼び出します。

手順 5: プレゼンテーション 層のデータを操作する

クラスが EmployeesBLLWithSprocs 完了したら、ASP.NET ページを使用して従業員データを操作する準備ができました。 フォルダー内のJOINs.aspxページをAdvancedDAL開き、GridView をツールボックスからDesignerにドラッグし、そのプロパティを IDEmployees設定します。 次に、GridView のスマート タグから、グリッドを という名前 EmployeesDataSourceの新しい ObjectDataSource コントロールにバインドします。

クラスを使用するように ObjectDataSource をEmployeesBLLWithSprocs構成し、[SELECT] タブと [DELETE] タブで、 メソッドと DeleteEmployee メソッドがドロップダウン リストから選択されていることを確認GetEmployeesします。 [完了] をクリックして ObjectDataSource の構成を完了します。

EmployeesBLLWithSprocs クラスを使用するように ObjectDataSource を構成する

図 12: クラスを使用するように ObjectDataSource を構成する EmployeesBLLWithSprocs (フルサイズの画像を表示する をクリックします)

ObjectDataSource で GetEmployees メソッドと DeleteEmployee メソッドを使用する

図 13: ObjectDataSource で メソッドと DeleteEmployee メソッドをGetEmployees使用する (クリックするとフルサイズの画像が表示されます)

Visual Studio では、各列の GridView に BoundField が EmployeesDataTable 追加されます。 、、FirstName、、および を除くTitleLastNameこれらの BoundFields をすべて削除しManagerLastName、最後の 4 つの BoundFields のプロパティの名前をそれぞれ Last Name、First Name、Manager s First Name、Manager s Last Name に変更HeaderTextManagerFirstNameします。

ユーザーがこのページから従業員を削除できるようにするには、2 つの操作を行う必要があります。 最初に、スマート タグから [削除を有効にする] オプションをオンにして、削除機能を提供するように GridView に指示します。 次に、ObjectDataSource の OldValuesParameterFormatString プロパティを、ObjectDataSource ウィザード () によって設定された値から既定値 (original_{0}{0}) に変更します。 これらの変更を行った後、GridView と ObjectDataSource の宣言型マークアップは次のようになります。

<asp:GridView ID="Employees" runat="server" AutoGenerateColumns="False" 
    DataKeyNames="EmployeeID" DataSourceID="EmployeesDataSource">
    <Columns>
        <asp:CommandField ShowDeleteButton="True" />
        <asp:BoundField DataField="Title" 
            HeaderText="Title" 
            SortExpression="Title" />
        <asp:BoundField DataField="LastName" 
            HeaderText="Last Name" 
            SortExpression="LastName" />
        <asp:BoundField DataField="FirstName" 
            HeaderText="First Name" 
            SortExpression="FirstName" />
        <asp:BoundField DataField="ManagerFirstName" 
            HeaderText="Manager's First Name" 
            SortExpression="ManagerFirstName" />
        <asp:BoundField DataField="ManagerLastName" 
            HeaderText="Manager's Last Name" 
            SortExpression="ManagerLastName" />
    </Columns>
</asp:GridView>
<asp:ObjectDataSource ID="EmployeesDataSource" runat="server" 
    DeleteMethod="DeleteEmployee" OldValuesParameterFormatString="{0}" 
    SelectMethod="GetEmployees" TypeName="EmployeesBLLWithSprocs">
    <DeleteParameters>
        <asp:Parameter Name="employeeID" Type="Int32" />
    </DeleteParameters>
</asp:ObjectDataSource>

ブラウザーからページにアクセスして、ページをテストします。 図 14 に示すように、ページには各従業員とその上司の名前が一覧表示されます (あると仮定)。

Employees_Select ストアド プロシージャの JOIN は、マネージャーの名前を返します

図 14: JOIN ストアド プロシージャ内の Employees_Select は、マネージャーの名前を返します (フルサイズの画像を表示するには、ここをクリックします)

[削除] ボタンをクリックすると、削除ワークフローが開始され、ストアド プロシージャの Employees_Delete 実行が終了します。 ただし、ストアド プロシージャで試行されたステートメントは DELETE 、外部キー制約違反のために失敗します (図 15 を参照)。 具体的には、各従業員がテーブルに 1 つ以上のレコードを Orders 持っており、削除が失敗します。

対応する注文がある従業員を削除すると、外部キー制約違反が発生する

図 15: 対応する注文がある従業員を削除すると、外部キー制約違反が発生します (フルサイズの画像を表示する をクリックします)

従業員の削除を許可するには、次の手順を実行します。

  • 削除を連鎖するように外部キー制約を更新します。
  • 削除する従業員の Orders テーブルからレコードを手動で削除するか、
  • レコードを削除する Employees_Delete 前に、最初にテーブルから関連レコードを Orders 削除するようにストアド プロシージャを Employees 更新します。 この手法については、「 Typed DataSet s TableAdapters の既存のストアド プロシージャを使用 する」チュートリアルで説明しました。

これは読者の演習として残しておきます。

まとめ

リレーショナル データベースを使用する場合、クエリは複数の関連テーブルからデータをプルするのが一般的です。 相関サブクエリと s は、 JOIN クエリ内の関連テーブルからデータにアクセスするための 2 つの異なる手法を提供します。 TableAdapter は、 に関連JOINするクエリに対して 、UPDATE、および DELETE ステートメントを自動生成INSERTできないため、前のチュートリアルでは、相関サブクエリを最も一般的に使用しました。 これらの値は手動で指定できますが、アドホック SQL ステートメントを使用する場合、TableAdapter 構成ウィザードが完了すると、カスタマイズが上書きされます。

幸いなことに、ストアド プロシージャを使用して作成された TableAdapter は、アドホック SQL ステートメントを使用して作成されたものと同じ脆弱性に悩まされません。 したがって、ストアド プロシージャを使用するときに メイン クエリで を使用JOINする TableAdapter を作成できます。 このチュートリアルでは、このような TableAdapter を作成する方法について説明しました。 まず、JOINTableAdapter の メイン クエリに対して -less SELECT クエリを使用して、対応する挿入、更新、および削除ストアド プロシージャが自動的に作成されるようにしました。 TableAdapter の初期構成が完了したら、 を使用JOINするようにストアド プロシージャを拡張SelectCommandし、TableAdapter 構成ウィザードを再実行して列をEmployeesDataTable更新しました。

TableAdapter 構成ウィザードを再実行すると、ストアド プロシージャによって返されるデータ フィールドを反映するように列が自動的にEmployees_Select更新EmployeesDataTableされます。 または、これらの列を DataTable に手動で追加することもできます。 次のチュートリアルでは、DataTable に列を手動で追加する方法について説明します。

プログラミングに満足!

著者について

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

特別な感謝

このチュートリアル シリーズは、多くの役立つ校閲者によってレビューされました。 このチュートリアルのリード レビュー担当者は、Hilton Geisenow、David Suru、Daveller Murphy でした。 今後の MSDN 記事の確認に関心がありますか? その場合は、 に行mitchell@4GuysFromRolla.comをドロップしてください。