データ アクセス層を作成する (VB)

作成者: Scott Mitchell

PDF のダウンロード

このチュートリアルでは、最初から開始し、型指定された DataSets を使用してデータ アクセス層 (DAL) を作成し、データベース内の情報にアクセスします。

はじめに

Web 開発者としての私たちの生活は、データの操作を中心にしています。 データを格納するデータベース、データを取得して変更するコード、およびデータを収集して要約するための Web ページを作成します。 これは、ASP.NET 2.0 でこれらの一般的なパターンを実装するための手法について説明する、長いシリーズの最初のチュートリアルです。 まず、型指定された DataSets を使用するデータ アクセス層 (DAL)、カスタム ビジネス ルールを適用するビジネス ロジック層 (BLL)、および共通のページ レイアウトを共有する ASP.NET ページで構成されるプレゼンテーション レイヤーで構成される ソフトウェア アーキテクチャ を作成します。 このバックエンドの基礎が築かれたら、レポートに移り、Web アプリケーションからデータを表示、集計、収集、検証する方法を示します。 これらのチュートリアルは簡潔にし、プロセスを視覚的に説明するためのスクリーン ショットを豊富に備えた詳細な手順を提供します。 各チュートリアルは、C# と Visual Basic のバージョンで使用でき、使用される完全なコードのダウンロードが含まれています。 (この最初のチュートリアルは非常に長いですが、残りの部分ははるかに消化可能なチャンクで示されています。

これらのチュートリアルでは、ディレクトリに配置された Microsoft SQL Server 2005 Express Edition バージョンの Northwind データベースをApp_Data使用します。 データベース ファイルに加えて、 フォルダーには、 App_Data 別のデータベース バージョンを使用する場合に備えて、データベースを作成するための SQL スクリプトも含まれています。 Northwind データベースの別のSQL Serverバージョンを使用する場合は、アプリケーションのWeb.configファイルの設定をNORTHWNDConnectionString更新する必要があります。 Web アプリケーションは、ファイル システム ベースの Web サイト プロジェクトとして Visual Studio 2005 Professional Edition を使用して構築されました。 ただし、すべてのチュートリアルは、Visual Studio 2005 ( Visual Web Developer) の無料バージョンでも同様に機能します。

このチュートリアルでは、最初から始めてデータ アクセス層 (DAL) を作成し、次に 2 番目のチュートリアルで ビジネス ロジックレイヤー (BLL) を作成し、3 番目のチュートリアルで ページ レイアウトとナビゲーション に取り組みます。 3番目のチュートリアルの後のチュートリアルは、最初の3つに置かれた基礎に基づいて構築されます。 この最初のチュートリアルで取り上げる必要がある内容が多いので、Visual Studio を起動して、始めましょう。

手順 1: Web プロジェクトの作成とデータベースへの接続

データ アクセス層 (DAL) を作成する前に、まず Web サイトを作成し、データベースを設定する必要があります。 まず、新しいファイル システム ベースの ASP.NET Web サイトを作成します。 これを行うには、[ファイル] メニューに移動し、[新しい Web サイト] を選択し、[新しい Web サイト] ダイアログ ボックスを表示します。 ASP.NET Web サイト テンプレートを選択し、[場所] ドロップダウン リストを [ファイル システム] に設定し、Web サイトを配置するフォルダーを選択して、言語を Visual Basic に設定します。

Web サイト System-Based 新しいファイルを作成する

図 1: 新しいファイル System-Based Web サイトを作成する (フルサイズの画像を表示する] をクリックします)

これにより、ASP.NET ページ、フォルダー、ファイルをApp_Data含むDefault.aspx新しい Web サイトがWeb.config作成されます。

Web サイトを作成したら、次の手順として、Visual Studio のサーバー エクスプローラーでデータベースへの参照を追加します。 サーバー エクスプローラーにデータベースを追加すると、Visual Studio 内からテーブル、ストアド プロシージャ、ビューなどを追加できます。 また、テーブル データを表示したり、クエリ ビルダーを使用して手動またはグラフィカルに独自のクエリを作成したりすることもできます。 さらに、DAL の型指定されたデータセットをビルドする場合は、型指定された DataSet を構築する必要があるデータベースを Visual Studio にポイントする必要があります。 その時点でこの接続情報を提供できますが、Visual Studio によって、サーバー エクスプローラーに既に登録されているデータベースのドロップダウン リストが自動的に設定されます。

Northwind データベースをサーバー エクスプローラーに追加する手順は、フォルダー内App_DataのSQL Server 2005 Express Edition データベースを使用するかどうか、または代わりに使用する Microsoft SQL Server 2000 または 2005 データベース サーバーのセットアップがあるかどうかによって異なります。

フォルダー内のデータベースのApp_Data使用

接続するSQL Server 2000 または 2005 データベース サーバーがない場合、または単にデータベース サーバーにデータベースを追加する必要がない場合は、ダウンロードした Web サイトApp_Dataのフォルダー (NORTHWND.MDF) にある Northwind データベースのSQL Server 2005 Express Editionバージョンを使用できます。

フォルダーに配置されたApp_Dataデータベースは、サーバー エクスプローラーに自動的に追加されます。 コンピューターにSQL Server 2005 Express Editionがインストールされていると仮定すると、NORTHWND という名前のノードが表示されます。サーバー エクスプローラーの MDF。テーブル、ビュー、ストアド プロシージャなどを展開および探索できます (図 2 を参照)。

フォルダーにはApp_Data、Microsoft Access .mdb ファイルを保持することもできます。このファイルは、SQL Server対応するファイルと同様に、サーバー エクスプローラーに自動的に追加されます。 SQL Serverオプションを使用しない場合は、常に Northwind Traders データベースとアプリをインストールし、ディレクトリにApp_Dataドロップできます。 ただし、Access データベースはSQL Serverほど機能が豊富で、Web サイトのシナリオで使用するように設計されていないことに注意してください。 さらに、35 以上のチュートリアルの 2 つのチュートリアルでは、Access でサポートされていない特定のデータベース レベルの機能を利用します。

Microsoft SQL Server 2000 または 2005 データベース サーバーのデータベースへの接続

または、データベース サーバーにインストールされている Northwind データベースに接続することもできます。 データベース サーバーに Northwind データベースがまだインストールされていない場合は、最初に、このチュートリアルのダウンロードに含まれているインストール スクリプトを実行してデータベース サーバーに追加する必要があります。

データベースをインストールしたら、Visual Studio の [サーバー エクスプローラー] に移動し、[データ Connections] ノードを右クリックして、[接続の追加] を選択します。 [サーバー] エクスプローラーが表示されない場合は、[表示/サーバー] エクスプローラーに移動するか、Ctrl + Alt + S キーを押します。 これにより、[接続の追加] ダイアログ ボックスが表示され、接続先のサーバー、認証情報、データベース名を指定できます。 データベース接続情報を正常に構成し、[OK] ボタンをクリックすると、データベースが [データ Connections] ノードの下にノードとして追加されます。 データベース ノードを展開して、そのテーブル、ビュー、ストアド プロシージャなどを調べることができます。

データベース サーバーの Northwind データベースへの接続を追加する

図 2: データベース サーバーの Northwind データベースへの接続を追加する

手順 2: データ アクセス層を作成する

データを操作する場合の 1 つのオプションは、データ固有のロジックをプレゼンテーション レイヤーに直接埋め込むことです (Web アプリケーションでは、ASP.NET ページがプレゼンテーション レイヤーを構成します)。 これは、ASP.NET ページのコード部分に ADO.NET コードを記述するか、マークアップ部分から SqlDataSource コントロールを使用する形式になります。 どちらの場合も、このアプローチでは、データ アクセス ロジックとプレゼンテーション レイヤーが緊密に結合されます。 ただし、推奨される方法は、データ アクセス ロジックをプレゼンテーション レイヤーから分離することです。 この個別のレイヤーは、データ アクセス層 (DAL) と呼ばれ、通常は別のクラス ライブラリ プロジェクトとして実装されます。 この階層化アーキテクチャの利点は十分に文書化されており (これらの利点については、このチュートリアルの最後にある「その他の読み取り」セクションを参照)、このシリーズで取るアプローチです。

データベースへの接続の作成、および DELETE コマンドの発行UPDATESELECTINSERTなど、基になるデータ ソースに固有のすべてのコードは、DAL に配置する必要があります。 プレゼンテーション レイヤーには、このようなデータ アクセス コードへの参照は含めず、代わりに、すべてのデータ要求に対して DAL への呼び出しを行う必要があります。 データ アクセス層には、通常、基になるデータベース データにアクセスするためのメソッドが含まれます。 たとえば、Northwind データベースには Products 、販売対象の製品と Categories それらが属するカテゴリを記録する テーブルと テーブルがあります。 DAL には、次のようなメソッドがあります。

  • GetCategories(), すべてのカテゴリに関する情報を返します
  • GetProducts()すべての製品に関する情報を返します。
  • GetProductsByCategoryID(categoryID)指定したカテゴリに属するすべての製品を返します。
  • GetProductByProductID(productID)は、特定の製品に関する情報を返します

これらのメソッドが呼び出されると、データベースに接続し、適切なクエリを発行し、結果を返します。 これらの結果を返す方法は重要です。 これらのメソッドは、データベース クエリによって設定された DataSet または DataReader を返すだけですが、 厳密に型指定されたオブジェクトを使用してこれらの結果を返すのが理想的です。 厳密に型指定されたオブジェクトは、コンパイル時にスキーマが厳密に定義されているオブジェクトですが、一方、緩やかに型指定されたオブジェクトは、実行時までスキーマが認識されないオブジェクトです。

たとえば、DataReader と DataSet (既定) は緩やかに型指定されたオブジェクトです。スキーマは、データの設定に使用されるデータベース クエリによって返される列によって定義されるためです。 緩やかに型指定された DataTable から特定の列にアクセスするには、 のような DataTable.Rows(index)("columnName")構文を使用する必要があります。 この例の DataTable の緩やかな型指定は、文字列または序数インデックスを使用して列名にアクセスする必要があるという事実によって示されています。 一方、厳密に型指定された DataTable では、各列がプロパティとして実装され、次のようなコードが生成されます DataTable.Rows(index).columnName

厳密に型指定されたオブジェクトを返すために、開発者は独自のカスタム ビジネス オブジェクトを作成するか、型指定された DataSets を使用できます。 ビジネス オブジェクトは、通常、ビジネス オブジェクトが表す基になるデータベース テーブルの列をプロパティに反映するクラスとして、開発者によって実装されます。 型指定された DataSet は、データベース スキーマに基づいて Visual Studio によって生成され、そのメンバーがこのスキーマに従って厳密に型指定されたクラスです。 型指定された DataSet 自体は、dataSet、DataTable、DataRow クラス ADO.NET 拡張するクラスで構成されます。 厳密に型指定された DataTable に加えて、型指定された DataSet には TableAdapters も含まれるようになりました。これは、DataSet の DataTable を設定し、DataTable 内の変更をデータベースに反映するためのメソッドを持つクラスです。

注意

型指定されたデータセットとカスタム ビジネス オブジェクトを使用する場合の長所と短所の詳細については、「 データ層コンポーネントの設計」および「階層を通じてデータを渡す」を参照してください。

これらのチュートリアルのアーキテクチャでは、厳密に型指定された DataSets を使用します。 図 3 は、型指定されたデータセットを使用するアプリケーションのさまざまなレイヤー間のワークフローを示しています。

すべてのデータ アクセス コードが DAL に委任される

図 3: すべてのデータ アクセス コードが DAL に委任されている (フルサイズの画像を表示する をクリックします)

型指定された DataSet とテーブル アダプターの作成

DAL の作成を開始するには、まず、型指定された DataSet をプロジェクトに追加します。 これを行うには、ソリューション エクスプローラーでプロジェクト ノードを右クリックし、[新しい項目の追加] を選択します。 テンプレートの一覧から DataSet オプションを選択し、 という名前を付けます Northwind.xsd

プロジェクトに新しいデータセットを追加することを選択します

図 4: プロジェクトに新しいデータセットを追加することを選択します (フルサイズの画像を表示する場合はクリックします)

[追加] をクリックした後、DataSet をフォルダーに追加するように App_Code 求められたら、[はい] を選択します。 その後、型指定された DataSet のDesignerが表示され、TableAdapter 構成ウィザードが起動し、最初の TableAdapter を型指定された DataSet に追加できます。

型指定された DataSet は、厳密に型指定されたデータのコレクションとして機能します。厳密に型指定された DataTable インスタンスで構成され、それぞれが厳密に型指定された DataRow インスタンスで構成されます。 このチュートリアル シリーズで使用する必要がある基になるデータベース テーブルごとに、厳密に型指定された DataTable を作成します。 まず、テーブルの DataTable を Products 作成します。

厳密に型指定された DataTable には、基になるデータベース テーブルからデータにアクセスする方法に関する情報は含まれていないことに注意してください。 DataTable を設定するデータを取得するには、Data Access Layer として機能する TableAdapter クラスを使用します。 Products DataTable の場合、TableAdapter には、プレゼンテーション レイヤーから呼び出すメソッド GetProducts()GetProductByCategoryID(categoryID)、 などが含まれます。 DataTable の役割は、レイヤー間でデータを渡すために使用される厳密に型指定されたオブジェクトとして機能することです。

TableAdapter 構成ウィザードは、作業するデータベースの選択を求めるプロンプトから始まります。 ドロップダウン リストには、サーバー エクスプローラー内のデータベースが表示されます。 Northwind データベースをサーバー エクスプローラーに追加しなかった場合は、現時点で [新しい接続] ボタンをクリックしてこれを行うことができます。

Drop-Down リストから Northwind データベースを選択する

図 5: Drop-Down リストから Northwind データベースを選択する (フルサイズの画像を表示する をクリックします)

データベースを選択して [次へ] をクリックすると、ファイルに接続文字列を保存するかどうかを確認するメッセージがWeb.config表示されます。 接続文字列を保存すると、TableAdapter クラスでハードコーディングされるのを回避できます。これにより、接続文字列情報が将来変更された場合に作業が簡略化されます。 構成ファイルに接続文字列を保存することを選択した場合は、 セクションに配置<connectionStrings>されます。これは、必要に応じて暗号化してセキュリティを強化したり、IIS GUI 管理 ツール内の新しい ASP.NET 2.0 プロパティ ページを使用して後で変更したりできます。これは管理者にとってより理想的です。

接続文字列を Web.configに保存する

図 6: 接続文字列を に保存します Web.config (クリックするとフルサイズの画像が表示されます)

次に、最初の厳密に型指定された DataTable のスキーマを定義し、厳密に型指定された DataSet を設定するときに TableAdapter で使用する最初のメソッドを提供する必要があります。 これら 2 つの手順は、DataTable に反映するテーブルの列を返すクエリを作成することによって同時に実行されます。 ウィザードの最後に、このクエリにメソッド名を付けます。 これが完了したら、このメソッドをプレゼンテーション レイヤーから呼び出すことができます。 メソッドは、定義されたクエリを実行し、厳密に型指定された DataTable を設定します。

SQL クエリの定義を開始するには、まず TableAdapter でクエリを発行する方法を指定する必要があります。 アドホック SQL ステートメントを使用したり、新しいストアド プロシージャを作成したり、既存のストアド プロシージャを使用することができます。 これらのチュートリアルでは、アドホック SQL ステートメントを使用します。

アドホック SQL ステートメントを使用してデータのクエリを実行する

図 7: アドホック SQL ステートメントを使用してデータのクエリを実行する (フルサイズの画像を表示する 場合はクリックします)

この時点で、手動で SQL クエリを入力できます。 TableAdapter で最初のメソッドを作成するときは、通常、対応する DataTable で表現する必要がある列をクエリから返すようにします。 これを実現するには、テーブルのすべての列とすべての行を返すクエリを Products 作成します。

[SQL クエリ] をテキスト ボックスに入力します

図 8: [SQL クエリ] ボックスに「」と入力します (フルサイズの画像を表示するには、ここをクリックします)

または、図 9 に示すように、クエリ ビルダーを使用し、クエリをグラフィカルに構築します。

クエリ エディターを使用してグラフィカルにクエリを作成する

図 9: クエリ エディターを使用してクエリをグラフィカルに作成する (フルサイズの画像を表示する をクリックします)

クエリを作成した後、次の画面に移動する前に、[詳細オプション] ボタンをクリックします。 Web サイト プロジェクトでは、既定で選択されている唯一の詳細オプションは、"挿入、更新、および削除ステートメントの生成" です。クラス ライブラリまたは Windows プロジェクトからこのウィザードを実行する場合は、[オプティミスティック コンカレンシーを使用する] オプションも選択されます。 現時点では、[オプティミスティック コンカレンシーを使用する] オプションはオフのままにします。 オプティミスティック コンカレンシーについては、今後のチュートリアルで確認します。

[Insert、Update、Delete ステートメントの生成のみ] オプションを選択します

図 10: [挿入、更新、および削除ステートメントの生成のみ] オプションを選択します (フルサイズの画像を表示する場合はクリックします)

詳細オプションを確認したら、[次へ] をクリックして最後の画面に進みます。 ここでは、TableAdapter に追加するメソッドを選択するように求められます。 データの設定には、次の 2 つのパターンがあります。

  • DataTable を パラメーターとして受け取り、クエリの結果に基づいてデータテーブルを設定するメソッドが作成されるこの方法で DataTable に入力します。 たとえば、ADO.NET DataAdapter クラスは、 メソッドを使用してこのパターンをFill()実装します。
  • この方法で DataTable を返します。このメソッドは DataTable を自動的に作成して塗りつぶし、それをメソッドの戻り値として返します。

TableAdapter にこれらのパターンの一方または両方を実装させることができます。 ここで提供されているメソッドの名前を変更することもできます。 これらのチュートリアル全体で後者のパターンのみを使用する場合でも、両方のチェック ボックスをオンのままにしましょう。 また、むしろジェネリック GetData メソッドの名前を に GetProducts変更しましょう。

チェック ボックスをオンにすると、最後のチェック ボックス "GenerateDBDirectMethods" によって TableAdapter の 、Update()、および Delete() メソッドが作成Insert()されます。 このオプションをオフのままにした場合、すべての更新は TableAdapter の唯一 Update() のメソッドを使用して行う必要があります。このメソッドは、型指定された DataSet、DataTable、単一の DataRow、または DataRows の配列を受け取ります。 (図 9 の詳細プロパティの [挿入、更新、および削除ステートメントの生成] オプションをオフにした場合、このチェック ボックスの設定は無効になります)。このチェックボックスはオンのままにしておきましょう。

メソッド名を GetData から GetProducts に変更する

図 11: メソッド名を から GetDataGetProducts 変更します (クリックするとフルサイズの画像が表示されます)

[完了] をクリックしてウィザードを完了します。 ウィザードが閉じると、先ほど作成した DataTable を示す DataSet Designerに戻ります。 DataTable (、、 ProductNameなど) の列Productsの一覧と、 (Fill()GetProducts()) のメソッドをProductsTableAdapter確認できます。ProductID

型指定された DataSet に Products DataTable と ProductsTableAdapter が追加されました

図 12: Products DataTable と ProductsTableAdapter が型指定された DataSet に追加されました (フルサイズの画像を表示する 場合は、ここをクリックします)

この時点で、1 つの DataTable (Northwind.Products) を持つ型指定された DataSet と、厳密に型指定された DataAdapter クラス (NorthwindTableAdapters.ProductsTableAdapter) とメソッドがあります GetProducts() 。 これらのオブジェクトを使用して、次のようなコードからすべての製品の一覧にアクセスできます。

Dim productsAdapter As New NorthwindTableAdapters.ProductsTableAdapter()
Dim products as Northwind.ProductsDataTable
products = productsAdapter.GetProducts()
For Each productRow As Northwind.ProductsRow In products
    Response.Write("Product: " & productRow.ProductName & "<br />")
Next

このコードでは、データ アクセス固有のコードを 1 ビット記述する必要はありませんでした。 ADO.NET クラスをインスタンス化する必要はありませんでした。接続文字列、SQL クエリ、またはストアド プロシージャを参照する必要はありませんでした。 代わりに、TableAdapter は低レベルのデータ アクセス コードを提供します。

この例で使用される各オブジェクトも厳密に型指定されているため、Visual Studio で IntelliSense とコンパイル時の型チェックを提供できます。 また、TableAdapter によって返されるすべての DataTable の中でも、GridView、DetailsView、DropDownList、CheckBoxList などのデータ Web コントロールを ASP.NET にバインドできます。 次の例は、 メソッドによって GetProducts() 返された DataTable を、イベント ハンドラー内のスキャンされた 3 行のコードで GridView にバインドする方法を Page_Load 示しています。

AllProducts.aspx

<%@ Page Language="VB" AutoEventWireup="true" CodeFile="AllProducts.aspx.vb"
    Inherits="AllProducts" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>View All Products in a GridView</title>
    <link href="Styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <h1>
            All Products</h1>
        <p>
            <asp:GridView ID="GridView1" runat="server"
             CssClass="DataWebControlStyle">
               <HeaderStyle CssClass="HeaderStyle" />
               <AlternatingRowStyle CssClass="AlternatingRowStyle" />
            </asp:GridView>
             </p>
    </div>
    </form>
</body>
</html>

AllProducts.aspx.vb

Imports NorthwindTableAdapters
Partial Class AllProducts
    Inherits System.Web.UI.Page
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
        Handles Me.Load
        Dim productsAdapter As New ProductsTableAdapter
        GridView1.DataSource = productsAdapter.GetProducts()
        GridView1.DataBind()
    End Sub
End Class

製品の一覧が GridView に表示される

図 13: 製品の一覧が GridView に表示される (フルサイズの画像を表示する をクリックします)

この例では、ASP.NET ページのイベント ハンドラーに 3 行の Page_Load コードを記述する必要があります。今後のチュートリアルでは、ObjectDataSource を使用して DAL からデータを宣言的に取得する方法について説明します。 ObjectDataSource を使用すると、コードを記述する必要はありません。ページングと並べ替えのサポートも提供されます。

手順 3: パラメーター化されたメソッドをデータ アクセス層に追加する

この時点で、クラス ProductsTableAdapter には 1 つのメソッド があります。このメソッド GetProducts()は、データベース内のすべての製品を返します。 すべての製品で作業できることは間違いなく便利ですが、特定の製品、または特定のカテゴリに属するすべての製品に関する情報を取得したい場合があります。 このような機能をデータ アクセス層に追加するには、パラメーター化されたメソッドを TableAdapter に追加します。

メソッドを GetProductsByCategoryID(categoryID) 追加しましょう。 DAL に新しいメソッドを追加するには、DataSet Designerに戻り、セクションを右クリックして、[クエリのProductsTableAdapter追加] を選択します。

TableAdapter を右クリックし、[クエリの追加] を選択します

図 14: TableAdapter の Right-Click とクエリの追加の選択

最初に、アドホック SQL ステートメントを使用してデータベースにアクセスするか、新規または既存のストアド プロシージャを使用するかについて確認するメッセージが表示されます。 アドホック SQL ステートメントをもう一度使用することを選択しましょう。 次に、使用する SQL クエリの種類を確認します。 指定したカテゴリに属するすべての製品を返す必要があるため、行を返すステートメントを SELECT 記述します。

行を返す SELECT ステートメントを作成することを選択します

図 15: 行を返すステートメントを SELECT 作成することを選択します (フルサイズの画像を表示する場合はクリックします)

次の手順では、データへのアクセスに使用する SQL クエリを定義します。 特定のカテゴリに属する製品のみを返す必要があるため、 からGetProducts()同じSELECTステートメントを使用しますが、次WHEREの句を追加します。 WHERE CategoryID = @CategoryID パラメーターは @CategoryID TableAdapter ウィザードに対して、作成するメソッドに対応する型 (つまり null 許容整数) の入力パラメーターが必要であることを示します。

指定したカテゴリの製品のみを返すクエリを入力する

図 16: 指定したカテゴリの製品のみを返すクエリを入力します (フルサイズの画像を表示する をクリックします)

最後の手順では、使用するデータ アクセス パターンを選択したり、生成されるメソッドの名前をカスタマイズしたりできます。 Fill パターンの場合は、戻り値の DataTable 戻りパターン (GetXメソッド) の名前を にFillByCategoryID変更し、 を使用GetProductsByCategoryIDしましょう。

TableAdapter メソッドの名前を選択する

図 17: TableAdapter メソッドの名前を選択する (フルサイズの画像を表示する をクリックします)

ウィザードが完了すると、DataSet Designerには新しい TableAdapter メソッドが含まれます。

製品をカテゴリ別に照会できるようになりました

図 18: 製品をカテゴリ別に照会できるようになりました

少し時間を取って、同じ手法を GetProductByProductID(productID) 使用してメソッドを追加します。

これらのパラメーター化されたクエリは、DataSet Designerから直接テストできます。 TableAdapter でメソッドを右クリックし、[データのプレビュー] を選択します。 次に、パラメーターに使用する値を入力し、[プレビュー] をクリックします。

飲料カテゴリーに属する商品が表示されます。

図 19: 飲料カテゴリに属する製品が表示されています (フルサイズの画像を表示する をクリックします)

DAL の メソッドを GetProductsByCategoryID(categoryID) 使用すると、指定したカテゴリの製品のみを表示する ASP.NET ページを作成できるようになりました。 次の例は、[飲料] カテゴリにあるすべての製品を示しています。このカテゴリには、 CategoryID が 1 です。

Beverages.aspx

<%@ Page Language="VB" AutoEventWireup="true" CodeFile="Beverages.aspx.vb"
    Inherits="Beverages" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
    <link href="Styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <h1>Beverages</h1>
        <p>
            <asp:GridView ID="GridView1" runat="server"
             CssClass="DataWebControlStyle">
               <HeaderStyle CssClass="HeaderStyle" />
               <AlternatingRowStyle CssClass="AlternatingRowStyle" />
            </asp:GridView>
             </p>
    </div>
    </form>
</body>
</html>

Beverages.aspx.vb

Imports NorthwindTableAdapters
Partial Class Beverages
    Inherits System.Web.UI.Page
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
        Handles Me.Load
        Dim productsAdapter As New ProductsTableAdapter
        GridView1.DataSource =
         productsAdapter.GetProductsByCategoryID(1)
        GridView1.DataBind()
    End Sub
End Class

飲料カテゴリーの商品が表示されます。

図 20: 飲料カテゴリの製品が表示されます (フルサイズの画像を表示する をクリックします)

手順 4: データの挿入、更新、削除

データの挿入、更新、削除には、一般的に使用される 2 つのパターンがあります。 データベース ダイレクト パターンを呼び出す最初のパターンには、呼び出されたときに、単一のデータベース レコードを操作するデータベースに対して 、UPDATE、または DELETE コマンドを発行INSERTするメソッドの作成が含まれます。 このようなメソッドは通常、挿入、更新、または削除する値に対応する一連のスカラー値 (整数、文字列、ブール値、DateTimes など) で渡されます。 たとえば、テーブルのこのパターン Products では、delete メソッドは削除するレコードの を示す ProductID 整数パラメーターを受け取り、insert メソッドは の ProductName文字列、の 10 進数 UnitPrice、、 の整数 UnitsOnStockなどを受け取ります。

挿入、更新、および削除の各要求は、すぐにデータベースに送信されます

図 21: 挿入、更新、および削除の各要求は、データベースにすぐに送信されます (フルサイズの画像を表示する をクリックします)

もう 1 つのパターンは、バッチ更新パターンと呼ばれますが、1 つのメソッド呼び出しで DataSet、DataTable、または DataRows のコレクション全体を更新することです。 このパターンを使用すると、開発者は DataTable 内の DataRows を削除、挿入、および変更し、それらの DataRows または DataTable を更新メソッドに渡します。 このメソッドは、渡された DataRows を列挙し、(DataRow の RowState プロパティ 値を使用して) 変更、追加、または削除されたかどうかを判断し、各レコードに対して適切なデータベース要求を発行します。

Update メソッドが呼び出されると、すべての変更がデータベースと同期されます

図 22: Update メソッドが呼び出されると、すべての変更がデータベースと同期されます (フルサイズの画像を表示する 場合はクリックします)

TableAdapter では、既定でバッチ更新パターンが使用されますが、DB ダイレクト パターンもサポートされます。 TableAdapter の作成時に [Advanced Properties]\(高度なプロパティ\) から [Generate Insert, Update, and Delete statements]\(挿入、更新、および削除ステートメントの生成\) オプションを選択したので、 ProductsTableAdapter にはバッチ更新パターンを Update() 実装する メソッドが含まれています。 具体的には、TableAdapter には、型指定された DataSet、厳密に型指定された DataTable、または 1 つ以上の DataRows を渡すことができるメソッドが含 Update() まれています。 TableAdapter を最初に作成するときに [GenerateDBDirectMethods] チェック ボックスをオンのままにした場合、DB ダイレクト パターンも 、Update()、および Delete() メソッドを使用してInsert()実装されます。

どちらのデータ変更パターンでも、TableAdapter の InsertCommand、、UpdateCommandおよび DeleteCommand プロパティを使用して、データベースに対して 、INSERTUPDATE、および DELETE コマンドを発行します。 DataSet Designerで TableAdapter をクリックし、プロパティ ウィンドウに移動することで、および プロパティを検査および変更InsertCommandUpdateCommandDeleteCommandできます。 (TableAdapter を選択していること、およびProductsTableAdapterオブジェクトがプロパティ ウィンドウのドロップダウン リストで選択されていることを確認します)。

TableAdapter には、InsertCommand、UpdateCommand、DeleteCommand の各プロパティがあります

図 23: TableAdapter には、 UpdateCommandDeleteCommand の各プロパティがあります InsertCommand(フルサイズの画像を表示する場合は、ここをクリックします)

これらのデータベース コマンド プロパティのいずれかを調べたり変更したりするには、サブプロパティを CommandText クリックすると、クエリ ビルダーが表示されます。

クエリ ビルダーで INSERT、UPDATE、および DELETE ステートメントを構成する

図 24: クエリ ビルダーで 、UPDATE、および DELETE ステートメントを構成INSERTする (フルサイズの画像を表示する をクリックします)

次のコード例は、バッチ更新パターンを使用して、廃止されず、在庫数が 25 ユニット以下のすべての製品の価格を 2 倍にする方法を示しています。

Dim productsAdapter As New NorthwindTableAdapters.ProductsTableAdapter()
Dim products As Northwind.ProductsDataTable = productsAdapter.GetProducts()
For Each product As Northwind.ProductsRow In products
   If Not product.Discontinued AndAlso product.UnitsInStock <= 25 Then
      product.UnitPrice *= 2
   End if
Next
productsAdapter.Update(products)

次のコードは、DB ダイレクト パターンを使用してプログラムによって特定の製品を削除し、更新してから新しい製品を追加する方法を示しています。

Dim productsAdapter As New NorthwindTableAdapters.ProductsTableAdapter()
productsAdapter.Delete(3)
productsAdapter.Update( _
    "Chai", 1, 1, "10 boxes x 20 bags", 18.0, 39, 15, 10, false, 1)
productsAdapter.Insert( _
    "New Product", 1, 1, "12 tins per carton", 14.95, 15, 0, 10, false)

カスタム挿入、更新、および削除メソッドの作成

Update()DB ダイレクト メソッドによって作成される 、、および Delete() メソッドはInsert()、特に多くの列を持つテーブルでは、少し面倒な場合があります。 前のコード例を見ると、IntelliSense のヘルプがなければ、どのテーブル列が各入力パラメーターと メソッドにマップされるかProductsは特にUpdate()Insert()明確ではありません。 1 つまたは 2 つの列のみを更新する場合や、新しく挿入されたレコードIDENTITYの (自動インクリメント) フィールドの値を返すカスタマイズされたInsert()メソッドが必要な場合があります。

このようなカスタム メソッドを作成するには、DataSet Designerに戻ります。 TableAdapter を右クリックし、[クエリの追加] を選択して TableAdapter ウィザードに戻ります。 2 番目の画面では、作成するクエリの種類を示すことができます。 新しい製品を追加し、新しく追加されたレコード ProductIDの 値を返すメソッドを作成しましょう。 そのため、クエリを作成 INSERT することを選択します。

Products テーブルに新しい行を追加するメソッドを作成する

図 25: テーブルに新しい行を追加するメソッドを Products 作成する (フルサイズの画像を表示する をクリックします)

次の画面に の がInsertCommandCommandText表示されます。 このクエリを拡張するには、クエリの最後に を追加 SELECT SCOPE_IDENTITY() します。これにより、同じスコープ内の列に IDENTITY 挿入された最後の ID 値が返されます。 (@@IDENTITYの代わりに SCOPE_IDENTITY() を使用する場合の詳細と理由についてはSCOPE_IDENTITY()技術ドキュメントを参照してください)。 ステートメントを追加する前に INSERT 、必ずセミコロンでステートメントを SELECT 終了してください。

SCOPE_IDENTITY() 値を返すようにクエリを拡張する

図 26: 値を返すようにクエリを SCOPE_IDENTITY() 拡張する (フルサイズの画像を表示する場合はクリックします)

最後に、新しいメソッド InsertProductに という名前を付けます。

新しいメソッド名を InsertProduct に設定する

図 27: [新しいメソッド名] を に InsertProduct 設定します (クリックするとフルサイズの画像が表示されます)

DataSet Designerに戻ると、 InsertProductに新しいメソッド がProductsTableAdapter含まれていることがわかります。 この新しいメソッドにテーブル内の各列のパラメーターがない場合は、セミコロンで Products ステートメントを INSERT 終了するのを忘れている可能性があります。 メソッドをInsertProduct構成し、 ステートメントと SELECT ステートメントを区切るセミコロンがあることをINSERT確認します。

既定では、insert メソッドはクエリ以外のメソッドを発行します。つまり、影響を受ける行の数が返されます。 ただし、 メソッドは InsertProduct 、影響を受ける行数ではなく、クエリによって返される値を返すようにします。 これを実現するには、 メソッドExecuteModeの プロパティを InsertProduct に調整しますScalar

ExecuteMode プロパティを Scalar に変更する

図 28: プロパティを ExecuteModeScalar 変更します (クリックするとフルサイズの画像が表示されます)

次のコードは、この新しい InsertProduct メソッドの動作を示しています。

Dim productsAdapter As New NorthwindTableAdapters.ProductsTableAdapter()
Dim new_productID As Integer = Convert.ToInt32(productsAdapter.InsertProduct( _
    "New Product", 1, 1, "12 tins per carton", 14.95, 10, 0, 10, false))
productsAdapter.Delete(new_productID)

手順 5: データ アクセス層を完了する

クラスはProductsTableAdaptersテーブルから と SupplierID の値をProductsCategoryID返しますが、テーブルの列CategoriesCompanyNameテーブルの列Suppliersは含CategoryNameまれませんが、製品情報を表示するときに表示する列である可能性があります。 TableAdapter の初期メソッド GetProducts()である を拡張して、 と CompanyName 列の値の両方をCategoryName含めることができます。これにより、厳密に型指定された DataTable も更新され、これらの新しい列も含まれます。

ただし、TableAdapter のデータの挿入、更新、および削除のメソッドはこの初期メソッドに基づいているので、問題が発生する可能性があります。 幸い、挿入、更新、削除のための自動生成メソッドは、 句のサブクエリの影響を SELECT 受けません。 ではなく、サブクエリにクエリを Categories 追加したり Suppliers 、サブクエリとしてクエリを追加したりすることで、 JOIN データを変更するためにこれらのメソッドを修正する必要がなくなります。 で ProductsTableAdapter メソッドをGetProducts()右クリックし、[構成] を選択します。 次に、 句を SELECT 次のように調整します。

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

GetProducts() メソッドの SELECT ステートメントを更新する

図 29: メソッドの ステートメントをSELECTGetProducts()更新します (フルサイズの画像を表示するには、ここをクリックします)

この新しいクエリをGetProducts()使用するように メソッドを更新すると、DataTable には と SupplierNameCategoryName 2 つの新しい列が含まれます。

Products DataTable に 2 つの新しい列がある

図 30: DataTable に Products 2 つの新しい列がある

少し時間を取って、 SELECT メソッドの GetProductsByCategoryID(categoryID) 句も更新してください。

using 構文をGetProducts()SELECTJOIN更新した場合、DataSet Designerは、DB ダイレクト パターンを使用してデータベース データを挿入、更新、削除するためのメソッドを自動生成できません。 代わりに、このチュートリアルの前半の メソッドと InsertProduct 同じように手動で作成する必要があります。 さらに、バッチ更新パターンを使用する場合は、および DeleteCommand プロパティの値を手動で指定InsertCommandUpdateCommandする必要があります。

残りの TableAdapters の追加

これまでは、1 つのデータベース テーブルに対する単一の TableAdapter の操作のみを確認してきました。 ただし、Northwind データベースには、Web アプリケーションで操作する必要がある関連テーブルがいくつか含まれています。 型指定された DataSet には、複数の関連する DataTable を含めることができます。 したがって、DAL を完了するには、これらのチュートリアルで使用する他のテーブルの DataTable を追加する必要があります。 型指定された DataSet に新しい TableAdapter を追加するには、DataSet Designerを開き、Designerを右クリックして、[追加] / [TableAdapter] を選択します。 これにより、新しい DataTable と TableAdapter が作成され、このチュートリアルで前に調べたウィザードについて説明します。

次のクエリを使用して、次の TableAdapter とメソッドを作成するには数分かかります。 内 ProductsTableAdapter のクエリには、各製品のカテゴリ名とサプライヤー名を取得するためのサブクエリが含まれることに注意してください。 さらに、フォローしている場合は、クラスGetProducts()の メソッドと GetProductsByCategoryID(categoryID) メソッドを既にProductsTableAdapter追加しています。

  • ProductsTableAdapter

    • GetProducts:

      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
      
    • GetProductsByCategoryID:

      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
      WHERE      CategoryID = @CategoryID
      
    • GetProductsBySupplierID:

      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
      WHERE SupplierID = @SupplierID
      
    • GetProductByProductID:

      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
      WHERE ProductID = @ProductID
      
  • CategoriesTableAdapter

    • GetCategories:

      SELECT     CategoryID, CategoryName, Description
      FROM         Categories
      
    • GetCategoryByCategoryID:

      SELECT     CategoryID, CategoryName, Description
      FROM         Categories
      WHERE CategoryID = @CategoryID
      
  • SuppliersTableAdapter

    • GetSuppliers:

      SELECT     SupplierID, CompanyName, Address,
      City, Country, Phone
      FROM         Suppliers
      
    • GetSuppliersByCountry:

      SELECT     SupplierID, CompanyName, Address,
      City, Country, Phone
      FROM         Suppliers
      WHERE Country = @Country
      
    • GetSupplierBySupplierID:

      SELECT     SupplierID, CompanyName, Address,
      City, Country, Phone
      FROM         Suppliers
      WHERE SupplierID = @SupplierID
      
  • EmployeesTableAdapter

    • GetEmployees:

      SELECT     EmployeeID, LastName, FirstName, Title,
      HireDate, ReportsTo, Country
      FROM         Employees
      
    • GetEmployeesByManager:

      SELECT     EmployeeID, LastName, FirstName, Title, 
      HireDate, ReportsTo, Country
      FROM         Employees
      WHERE ReportsTo = @ManagerID
      
    • GetEmployeeByEmployeeID:

      SELECT     EmployeeID, LastName, FirstName, Title,
      HireDate, ReportsTo, Country
      FROM         Employees
      WHERE EmployeeID = @EmployeeID
      

4 つの TableAdapter が追加された後の DataSet Designer

図 31: 4 つの TableAdapter が追加された後の DataSet Designer (フルサイズの画像を表示する をクリックします)

DAL へのカスタム コードの追加

型指定された DataSet に追加された TableAdapters と DataTable は、XML スキーマ定義ファイル (Northwind.xsd) として表されます。 このスキーマ情報を表示するには、ソリューション エクスプローラーでファイルをNorthwind.xsd右クリックし、[コードの表示] を選択します。

Northwinds 型の DataSet の XML スキーマ定義 (XSD) ファイル

図 32: Northwinds 型指定 DataSet の XML スキーマ定義 (XSD) ファイル (フルサイズの画像を表示する をクリックします)

このスキーマ情報は、コンパイル時または実行時 (必要に応じて) デザイン時に C# または Visual Basic コードに変換され、その時点でデバッガーでステップ実行できます。 この自動生成されたコードを表示するには、クラス ビューに移動し、TableAdapter クラスまたは型指定された DataSet クラスにドリルダウンします。 画面に [クラス ビュー] が表示されない場合は、[表示] メニューに移動してそこから選択するか、Ctrl + Shift + C キーを押します。 クラス ビューから、型指定された DataSet クラスと TableAdapter クラスのプロパティ、メソッド、およびイベントを確認できます。 特定のメソッドのコードを表示するには、クラス ビューでメソッド名をダブルクリックするか、右クリックして [定義へ移動] を選択します。

クラス ビューから [定義に移動] を選択して自動生成されたコードを検査する

図 33: クラス ビューから [定義に移動] を選択して自動生成されたコードを検査する

自動生成されたコードは時間を大幅に節約できますが、多くの場合、コードは非常に汎用的であり、アプリケーション固有のニーズを満たすようにカスタマイズする必要があります。 ただし、自動生成されたコードを拡張するリスクは、コードを生成したツールが、カスタマイズを "再生成" して上書きするタイミングであると判断する可能性があるということです。 .NET 2.0 の新しい部分クラスの概念を使用すると、クラスを複数のファイルに簡単に分割できます。 これにより、Visual Studio がカスタマイズを上書きすることを心配することなく、自動生成されたクラスに独自のメソッド、プロパティ、およびイベントを追加できます。

DAL をカスタマイズする方法を示すために、 クラスに メソッドをGetProducts()SuppliersRow追加しましょう。 クラスは SuppliersRow テーブル内の 1 つのレコードを Suppliers 表します。各サプライヤーは 0 から多くの製品を提供できるため GetProducts() 、指定した仕入先の製品が返されます。 これを行うには、 という名前SuppliersRow.vbのフォルダーに新しいクラス ファイルをApp_Code作成し、次のコードを追加します。

Imports NorthwindTableAdapters
Partial Public Class Northwind
    Partial Public Class SuppliersRow
        Public Function GetProducts() As Northwind.ProductsDataTable
            Dim productsAdapter As New ProductsTableAdapter
            Return productsAdapter.GetProductsBySupplierID(Me.SupplierID)
        End Function
    End Class
End Class

この部分クラスは、クラスをビルドするときに、定義したメソッドを Northwind.SuppliersRow 含むようにコンパイラに GetProducts() 指示します。 プロジェクトをビルドしてからクラス ビューに戻ると、 のGetProducts()Northwind.SuppliersRowメソッドとして一覧表示されます。

GetProducts() メソッドが Northwind.SuppliersRow クラスの一部になりました

図 34: メソッドが GetProducts() クラスの Northwind.SuppliersRow 一部になりました

次の GetProducts() コードに示すように、 メソッドを使用して特定のサプライヤーの製品のセットを列挙できるようになりました。

Dim suppliersAdapter As New NorthwindTableAdapters.SuppliersTableAdapter()
Dim suppliers As Northwind.SuppliersDataTable = suppliersAdapter.GetSuppliers()
For Each supplier As Northwind.SuppliersRow In suppliers
    Response.Write("Supplier: " & supplier.CompanyName)
    Response.Write("<ul>")
    Dim products As Northwind.ProductsDataTable = supplier.GetProducts()
    For Each product As Northwind.ProductsRow In products
        Response.Write("<li>" & product.ProductName & "</li>")
    Next
    Response.Write("</ul><p> </p>")
Next

このデータは、任意の ASP に表示することもできます。NET のデータ Web コントロール。 次のページでは、2 つのフィールドを持つ GridView コントロールを使用します。

  • 各仕入先の名前を表示する BoundField と
  • 各サプライヤーの メソッドによって返される結果にバインドされる BulletedList コントロールを GetProducts() 含む TemplateField。

このようなマスター詳細レポートを表示する方法については、今後のチュートリアルで確認します。 ここでは、この例は、 クラスに追加されたカスタム メソッドの使用を示すように Northwind.SuppliersRow 設計されています。

SuppliersAndProducts.aspx

<%@ Page Language="VB" CodeFile="SuppliersAndProducts.aspx.vb"
    AutoEventWireup="true" Inherits="SuppliersAndProducts" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
    <link href="Styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <h1>
            Suppliers and Their Products</h1>
        <p>
            <asp:GridView ID="GridView1" runat="server"
             AutoGenerateColumns="False"
             CssClass="DataWebControlStyle">
                <HeaderStyle CssClass="HeaderStyle" />
                <AlternatingRowStyle CssClass="AlternatingRowStyle" />
                <Columns>
                    <asp:BoundField DataField="CompanyName"
                      HeaderText="Supplier" />
                    <asp:TemplateField HeaderText="Products">
                        <ItemTemplate>
                            <asp:BulletedList ID="BulletedList1"
                             runat="server" DataSource="<%# CType(CType(Container.DataItem, System.Data.DataRowView).Row, Northwind.SuppliersRow).GetProducts() %>"
                                 DataTextField="ProductName">
                            </asp:BulletedList>
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>
             </p>
    </div>
    </form>
</body>
</html>

SuppliersAndProducts.aspx.vb

Imports NorthwindTableAdapters
Partial Class SuppliersAndProducts
    Inherits System.Web.UI.Page
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
        Handles Me.Load
        Dim suppliersAdapter As New SuppliersTableAdapter
        GridView1.DataSource = suppliersAdapter.GetSuppliers()
        GridView1.DataBind()
    End Sub
End Class

サプライヤーの会社名が左の列に表示され、右側に製品が表示されます

図 35: 仕入先の会社名が左側の列に表示され、右側の製品が表示されます (フルサイズの画像を表示するにはクリックします)

まとめ

DAL を作成する Web アプリケーションを構築するときは、プレゼンテーション レイヤーの作成を開始する前に、最初の手順の 1 つを実行する必要があります。 Visual Studio では、型指定された DataSets に基づいて DAL を作成することは、コード行を記述せずに 10 から 15 分で実行できるタスクです。 今後のチュートリアルは、この DAL に基づいて構築されます。 次の チュートリアル では、いくつかのビジネス ルールを定義し、それらを別のビジネス ロジック レイヤーに実装する方法を確認します。

プログラミングに満足!

もっと読む

このチュートリアルで説明するトピックの詳細については、次のリソースを参照してください。

このチュートリアルに含まれるトピックに関するビデオ トレーニング

著者について

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

特別な感謝

このチュートリアル シリーズは、多くの役に立つ校閲者によってレビューされました。 このチュートリアルのリード レビュー担当者は、Ron Green、Hilton Giesenow、Dennis Patterson、Liz Shulok、Abel Gomez、Carlos Santos でした。 今後の MSDN の記事を確認することに関心がありますか? その場合は、 にmitchell@4GuysFromRolla.com行をドロップしてください。