JOIN を使用するように TableAdapter を更新する (C#)
データベースを操作する場合は、複数のテーブルに分散されたデータを要求するのが一般的です。 2 つの異なるテーブルからデータを取得するには、相関サブクエリまたは JOIN 操作を使用できます。 このチュートリアルでは、関連付けられたサブクエリと JOIN 構文を比較してから、メイン クエリに JOIN を含む TableAdapter を作成する方法を確認します。
はじめに
リレーショナル データベースでは、作業に関心のあるデータは、多くの場合、複数のテーブルに分散されます。 たとえば、製品情報を表示する場合は、各製品の対応するカテゴリと仕入先の名前を一覧表示する必要があります。 テーブルには Products
CategoryID
と SupplierID
の値がありますが、実際のカテゴリ名と仕入先名はそれぞれ テーブルと Suppliers
テーブルにありますCategories
。
別の関連テーブルから情報を取得するには、 相関サブクエリ または JOIN
s を使用します。 相関サブクエリは、外部クエリの列を参照する入れ子になった SELECT
クエリです。 たとえば、データ アクセス層の作成に関するチュートリアルでは、メイン クエリで 2 つの相関サブクエリをProductsTableAdapter
使用して、各製品のカテゴリ名と仕入先名を返しました。 は JOIN
、2 つの異なるテーブルから関連する行をマージする SQL コンストラクトです。 SqlDataSource コントロールを使用したデータのクエリチュートリアルで を使用JOIN
して、各製品と共にカテゴリ情報を表示しました。
TableAdapters で s を使用 JOIN
することを控えた理由は、TableAdapter ウィザードで対応する INSERT
、 UPDATE
、および DELETE
ステートメントを自動生成する制限があるためです。 具体的には、TableAdapter の メイン クエリに が含JOIN
まれている場合、TableAdapter では、アドホック SQL ステートメントまたはストアド プロシージャを、その InsertCommand
、UpdateCommand
、および 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
) を操作できます。
Note
JOIN
は、リレーショナル データベースからデータに対してクエリを実行する場合に一般的に使用されます。 構文をJOIN
初めて使用する場合、またはその使用法を少しブラッシュアップする必要がある場合は、W3 Schools の SQL Join チュートリアルをお勧めします。 また、SQL オンライン ブックのJOIN
「基礎」と「サブクエリの基礎」セクションも参照してください。
JOIN
s と相関サブクエリは両方とも他のテーブルから関連データを取得するために使用できるため、多くの開発者は頭を悩み、使用する方法を疑問に思っています。 私が話したすべてのSQLの第一人者は、ほぼ同じことを言ったが、SQL Serverはほぼ同じ実行計画を作り出すので、パフォーマンスは本当に重要ではない。 その後、彼らのアドバイスは、あなたとあなたのチームが最も快適なテクニックを使用することです。 このアドバイスを与えた後、これらの専門家はすぐに相関サブクエリよりもsの JOIN
好みを表現することに注目してください。
型指定された DataSets を使用してデータ アクセスレイヤーを構築する場合、サブクエリを使用する場合はツールの動作が向上します。 特に、TableAdapter ウィザードでは、メイン クエリに がJOIN
含まれている場合、対応する INSERT
、UPDATE
、および 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
図 1: を含むメイン クエリを JOIN
入力します (クリックするとフルサイズの画像が表示されます)
既定では、TableAdapter は、メイン クエリに基づいて、および DELETE
ステートメントを自動的に作成INSERT
UPDATE
します。 [詳細設定] ボタンをクリックすると、この機能が有効になっていることがわかります。 この設定にもかかわらず、TableAdapter は、メイン クエリに が含まれているため、、、UPDATE
および DELETE
ステートメントをJOIN
作成INSERT
できません。
図 2: を含むメイン クエリを JOIN
入力する
[完了] をクリックしてウィザードを終了します。 この時点で、DataSet のDesignerには、クエリの列リストに返されるSELECT
各フィールドの列を含む DataTable を持つ単一の TableAdapter が含まれます。 これには、図 3 に CategoryName
示すように、 と SupplierName
が含まれます。
図 3: DataTable には、列リストに返される各フィールドの列が含まれています
DataTable には適切な列が含まれていますが、TableAdapter には 、InsertCommand
UpdateCommand
、および DeleteCommand
プロパティの値がありません。 これを確認するには、Designerで TableAdapter をクリックし、プロパティ ウィンドウに移動します。 そこで、、UpdateCommand
、および DeleteCommand
の各プロパティが (None) に設定されていることがわかりますInsertCommand
。
図 4: 、InsertCommand
UpdateCommand
、および DeleteCommand
プロパティが に設定されている (なし) (フルサイズの画像を表示する をクリックします)
この欠点を回避するために、プロパティ ウィンドウを使用して、および プロパティの InsertCommand
UpdateCommand
SQL ステートメントとDeleteCommand
パラメーターを手動で指定できます。 または、TableAdapter の メイン クエリを構成して、 を含JOIN
めないようにすることもできます。 これにより、INSERT
UPDATE
および DELETE
ステートメントを自動的に生成できます。 ウィザードが完了したら、構文が含まれるように、プロパティ ウィンドウから TableAdapter をSelectCommand
手動でJOIN
更新できます。
この方法は機能しますが、アドホック SQL クエリを使用する場合は非常に脆弱です。TableAdapter の メイン クエリがウィザードを通じて再構成されるたびに、自動生成された INSERT
、UPDATE
、および DELETE
ステートメントが再作成されるためです。 つまり、後で行ったすべてのカスタマイズは、TableAdapter を右クリックし、コンテキスト メニューから [構成] を選択し、ウィザードをもう一度完了すると失われます。
TableAdapter の自動生成された INSERT
、、 UPDATE
および DELETE
ステートメントの脆弱性は、幸いにもアドホック SQL ステートメントに限定されます。 TableAdapter でストアド プロシージャが使用されている場合は、ストアド プロシージャをカスタマイズSelectCommand
InsertCommand
UpdateCommand
DeleteCommand
し、ストアド プロシージャが変更されることを心配することなく TableAdapter 構成ウィザードを再実行できます。
次のいくつかの手順では、TableAdapter を作成します。最初は、対応する挿入、更新、および削除ストアド プロシージャが自動生成されるように、任意JOIN
の を省略するメイン クエリを使用します。 次に、 を SelectCommand
更新して、関連テーブルから追加の列を返す を JOIN
使用します。 最後に、対応するビジネス ロジック レイヤー クラスを作成し、ASP.NET Web ページで TableAdapter を使用する方法について説明します。
手順 1: 簡略化されたメイン クエリを使用して TableAdapter を作成する
このチュートリアルでは、DataSet のテーブルに TableAdapter と厳密に型指定された DataTable Employees
を NorthwindWithSprocs
追加します。 Employees
テーブルには、ReportsTo
従業員の上司の をEmployeeID
指定したフィールドが含まれています。 たとえば、従業員の Anne Dodsworth の値は ReportTo
EmployeeID
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 ウィザードは、対応する INSERT
、UPDATE
、および DELETE
ステートメントを含むストアド プロシージャと、メイン クエリを実行するためのストアド プロシージャを自動的に作成します。
次の手順では、TableAdapter のストアド プロシージャに名前を付けます。 図 6 に示すように、、Employees_Insert
、Employees_Update
、および Employees_Delete
の名前Employees_Select
を使用します。
図 6: TableAdapter のストアド プロシージャに名前を付ける (クリックするとフルサイズの画像が表示されます)
最後の手順では、TableAdapter のメソッドに名前を付けるよう求められます。 メソッド名として と GetEmployees
を使用Fill
します。 また、[Create methods to send updates to the database (GenerateDBDirectMethods)] チェック ボックスはオンのままにしてください。
図 7: TableAdapter のメソッドに名前を Fill
付け GetEmployees
、(クリックするとフルサイズの画像が表示されます)
ウィザードが完了したら、少し時間を取ってデータベース内のストアド プロシージャを調べます。 、および Employees_Delete
の 4 つの新しいものEmployees_Update
Employees_Select
Employees_Insert
が表示されます。 次に、 を EmployeesDataTable
調べて、作成し EmployeesTableAdapter
たばかりの状態にします。 DataTable には、メイン クエリによって返される各フィールドの列が含まれています。 TableAdapter をクリックし、プロパティ ウィンドウに移動します。 そこで、、、および DeleteCommand
の各プロパティが、対応するストアド プロシージャを呼び出すように正しく構成されていることがわかります。InsertCommand
UpdateCommand
図 8: TableAdapter には、挿入、更新、および削除の機能が含まれています (フルサイズの画像を表示する 場合はクリックします)
挿入、更新、および削除ストアド プロシージャが自動的に作成され InsertCommand
、、、 UpdateCommand
および DeleteCommand
プロパティが正しく構成された状態で、各従業員のマネージャーに関する追加情報を返すように、ストアド プロシージャをカスタマイズ SelectCommand
する準備ができました。 具体的には、 を使用JOIN
してマネージャーの と FirstName
LastName
の値を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_Select
と ManagerLastName
の値をManagerFirstName
返しますがEmployeesDataTable
、 にはこれらの列がありません。 これらの不足している列は、次の 2 つの方法のいずれかで DataTable に追加できます。
- 手動 - DataSet Designerで DataTable を右クリックし、[追加] メニューから [列] を選択します。 その後、列に名前を付け、それに応じてプロパティを設定できます。
- 自動的 に - TableAdapter 構成ウィザードは、ストアド プロシージャによって返されるフィールドを反映するように DataTable の列を
SelectCommand
更新します。 アドホック SQL ステートメントを使用する場合、 には が含まれるJOIN
ようになったためSelectCommand
、、、およびDeleteCommand
の各プロパティも削除InsertCommand
UpdateCommand
されます。 ただし、ストアド プロシージャを使用する場合、これらのコマンド プロパティはそのまま残ります。
前のチュートリアルでは、DataTable 列を手動で追加する方法について説明しました。たとえば、 マスター/詳細 詳細データ リストを含むマスター レコードの箇条書きの使用 や ファイルのアップロードなどです。このプロセスについては、次のチュートリアルでもう一度詳しく説明します。 ただし、このチュートリアルでは、TableAdapter 構成ウィザードを使用して自動アプローチを使用してみましょう。
まず、 を EmployeesTableAdapter
右クリックし、コンテキスト メニューから [構成] を選択します。 これにより、TableAdapter 構成ウィザードが表示されます。このウィザードには、選択、挿入、更新、削除に使用されるストアド プロシージャと、戻り値とパラメーター (存在する場合) が一覧表示されます。 図 10 は、このウィザードを示しています。 ここでは、ストアド プロシージャが Employees_Select
フィールドと ManagerLastName
フィールドをManagerFirstName
返すようになったことがわかります。
図 10: ウィザードは、ストアド プロシージャの更新された列の一覧を Employees_Select
表示します (フルサイズの画像を表示する をクリックします)
[完了] をクリックしてウィザードを完了します。 DataSet Designerに戻ると、 EmployeesDataTable
には と の 2 つの列が追加されます ManagerFirstName
ManagerLastName
。
図 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
インスタンスをNorthwindWithSprocs
返Adapter
します。 これは、 クラスと GetEmployees
DeleteEmployee
メソッドによって使用されます。 メソッドはGetEmployees
、 に対応する GetEmployees
メソッドをEmployeesTableAdapter
呼び出します。このメソッドはストアド プロシージャをEmployees_Select
呼び出し、その結果を に設定しますEmployeeDataTable
。 メソッドも DeleteEmployee
同様に、 ストアド プロシージャを EmployeesTableAdapter
呼び出す s Delete
メソッドを Employees_Delete
呼び出します。
手順 5: プレゼンテーション 層のデータを操作する
クラスが EmployeesBLLWithSprocs
完了したら、ASP.NET ページを使用して従業員データを操作する準備ができました。 フォルダー内のJOINs.aspx
ページをAdvancedDAL
開き、GridView をツールボックスからDesignerにドラッグし、そのプロパティを ID
にEmployees
設定します。 次に、GridView のスマート タグから、グリッドを という名前 EmployeesDataSource
の新しい ObjectDataSource コントロールにバインドします。
クラスを使用するように ObjectDataSource をEmployeesBLLWithSprocs
構成し、[SELECT] タブと [DELETE] タブで、 メソッドと DeleteEmployee
メソッドがドロップダウン リストから選択されていることを確認GetEmployees
します。 [完了] をクリックして ObjectDataSource の構成を完了します。
図 12: クラスを使用するように ObjectDataSource を構成する EmployeesBLLWithSprocs
(フルサイズの画像を表示する をクリックします)
図 13: ObjectDataSource で メソッドと DeleteEmployee
メソッドをGetEmployees
使用する (クリックするとフルサイズの画像が表示されます)
Visual Studio では、各列の GridView に BoundField が EmployeesDataTable
追加されます。 、、FirstName
、、および を除くTitle
LastName
これらの BoundFields をすべて削除しManagerLastName
、最後の 4 つの BoundFields のプロパティの名前をそれぞれ Last Name、First Name、Manager s First Name、Manager s Last Name に変更HeaderText
ManagerFirstName
します。
ユーザーがこのページから従業員を削除できるようにするには、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 に示すように、ページには各従業員とその上司の名前が一覧表示されます (あると仮定)。
図 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 を作成する方法について説明しました。 まず、JOIN
TableAdapter の メイン クエリに対して -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をドロップしてください。