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

作成者: Scott Mitchell

PDF のダウンロード

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

はじめに

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

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

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

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

相関サブクエリと 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 好みを表現することに注目してください。

型指定されたデータセットを使用してデータ アクセス層を構築する場合、サブクエリを使用する場合はツールの動作が向上します。 特に、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、Delete ステートメントの生成] チェック ボックスがオンの [詳細オプション] ウィンドウを示すスクリーンショット。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

[Create new stored procedures]\(新しいストアド プロシージャの作成\) オプションを選択します

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

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

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

このクエリには s が含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 s メソッドに Fill メソッドと GetEmployees という名前を付けます

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

ウィザードが完了したら、少し時間を取ってデータベース内のストアド プロシージャを調べます。 、および 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.csのフォルダーに新しいクラス ファイルを~/App_Code/BLL作成します。 このクラスは既存EmployeesBLLのクラスのセマンティクスを模倣します。この新しいクラスのみが提供するメソッドが少なく、DataSet ではなく Northwind DataSet を使用NorthwindWithSprocsします。 次のコードを EmployeesBLLWithSprocs クラスに追加します。

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using NorthwindWithSprocsTableAdapters;
[System.ComponentModel.DataObject]
public class EmployeesBLLWithSprocs
{
    private EmployeesTableAdapter _employeesAdapter = null;
    protected EmployeesTableAdapter Adapter
    {
        get
        {
            if (_employeesAdapter == null)
                _employeesAdapter = new EmployeesTableAdapter();
            return _employeesAdapter;
        }
    }
    [System.ComponentModel.DataObjectMethodAttribute
        (System.ComponentModel.DataObjectMethodType.Select, true)]
    public NorthwindWithSprocs.EmployeesDataTable GetEmployees()
    {
        return Adapter.GetEmployees();
    }
    [System.ComponentModel.DataObjectMethodAttribute
        (System.ComponentModel.DataObjectMethodType.Delete, true)]
    public bool DeleteEmployee(int employeeID)
    {
        int rowsAffected = Adapter.Delete(employeeID);
        // Return true if precisely one row was deleted, otherwise false
        return rowsAffected == 1;
    }
}

クラス 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をドロップしてください。