次の方法で共有


チュートリアル: ADO.NET と .NET Framework を使用して n 層データ アプリケーションを作成する

DataSet クラスと関連クラスは、アプリケーションがデータベースから切断されている間にアプリケーションがメモリ内のデータを操作できるようにする、2000 年代初頭のレガシ .NET Framework テクノロジです。 このテクノロジは、ユーザーがデータを変更し、変更をデータベースに保持できるアプリに特に役立ちます。 データセットは実証済みの成功したテクノロジですが、新しい .NET アプリケーションには Entity Framework Core を使用することをお勧めします。 Entity Framework は、オブジェクト モデルとして表形式データを操作するより自然な方法を提供し、よりシンプルなプログラミング インターフェイスを備えています。

N 層 データ アプリケーションは、データにアクセスし、複数の論理層 (層) に分割されたアプリケーション です。 アプリケーション コンポーネントを個別の階層に分離すると、アプリケーションの保守性とスケーラビリティが向上します。 これは、ソリューション全体の再設計を必要とせずに、1 つのレベルに適用できる新しいテクノロジの導入を容易にすることで実現します。 N 層アーキテクチャには、プレゼンテーション層、中間層、およびデータ層が含まれます。 中間層には、通常、データ アクセス層、ビジネス ロジック層、認証や検証などの共有コンポーネントが含まれます。 データ層にはリレーショナル データベースが含まれます。 N 層アプリケーションは、通常、プレゼンテーション層にアクセスするエンド ユーザーからの分離を維持するために、中間層のデータ アクセス層に機密情報を格納します。 詳細については、 N 層データ アプリケーションの概要に関するページを参照してください。

n 層アプリケーションのさまざまな層を分離する 1 つの方法は、アプリケーションに含める階層ごとに個別のプロジェクトを作成することです。 型指定されたデータセットには、生成されたデータセットとDataSet Projectコードを実行するプロジェクトを決定するTableAdapter プロパティが含まれています。

このチュートリアルでは、データセット TableAdapterを使用して、データセットと コードを個別のクラス ライブラリ プロジェクトに分割する方法について説明します。 データセットと TableAdapter コードを分離した後、 Visual Studio サービスで Windows Communication Foundation Services と WCF Data Services を作成し、データ アクセス層を呼び出します。 最後に、プレゼンテーション層として Windows フォーム アプリケーションを作成します。 この層は、データ サービスからデータにアクセスします。

このチュートリアルでは、次の手順を実行します。

  • 複数のプロジェクトを含む新しい n 層ソリューションを作成します。

  • n 層ソリューションに 2 つのクラス ライブラリ プロジェクトを追加します。

  • データ ソース構成ウィザードを使用して、型指定されたデータセットを作成します。

  • 生成された TableAdapters とデータセット コードを個別のプロジェクトに分割します。

  • データ アクセス層を呼び出す Windows Communication Foundation (WCF) サービスを作成します。

  • データ アクセス層からデータを取得する関数をサービスに作成します。

  • プレゼンテーション層として機能する Windows フォーム アプリケーションを作成します。

  • データ ソースにバインドされている Windows フォーム コントロールを作成します。

  • データ テーブルを設定するコードを記述します。

[前提条件]

このチュートリアルを完了するには、Visual Studio にインストールされている .NET デスクトップ開発ワークロードとデータ ストレージワークロードと処理ワークロードが必要です。 インストールするには、Visual Studio インストーラー を開き、変更したい Visual Studio のバージョンの横にある [変更] (または [その他の >変更])を選択します。 Visual Studio の変更に関するページを参照してください。

このチュートリアルでは、SQL Server Express LocalDB と Northwind サンプル データベースを使用します。

  1. SQL Server Express LocalDB がない場合は、 SQL Server Express のダウンロード ページまたは Visual Studio インストーラーからインストールします。 Visual Studio インストーラーでは、.NET デスクトップ開発ワークロードの一部として、または個々のコンポーネントとして SQL Server Express LocalDB をインストールできます。

  2. 次の手順に従って Northwind サンプル データベースをインストールします。

    1. Visual Studio で、 SQL Server オブジェクト エクスプローラー ウィンドウを開きます。 (SQL Server オブジェクト エクスプローラー は、Visual Studio インストーラーの データ ストレージと処理 ワークロードの一部としてインストールされます)。 SQL Server ノードを展開します。 LocalDB インスタンスを右クリックし、[ 新しいクエリ] を選択します。

      LocalDB インスタンスが表示されない場合は、ツール バーの [ SQL Server の追加] ボタンを使用します。 ダイアログが表示されます。 ダイアログで、[ ローカル ] を展開し、[ MSSQLLocalDB] を選択します。 適切な資格情報を入力します。 データベースの既定の選択肢のままにしておくことができます。

      [SQL Database への接続] ダイアログのスクリーンショット

    2. [接続] を選択します。 SQL Server オブジェクト エクスプローラーで LocalDB のノードが追加されます。

    3. LocalDB インスタンスを右クリックし、[ 新しいクエリ] を選択します。

      クエリ エディター ウィンドウが開きます。

    4. Northwind Transact-SQL スクリプトをクリップボードにコピーします。 この T-SQL スクリプトは、Northwind データベースを最初から作成し、データを設定します。

    5. T-SQL スクリプトをクエリ エディターに貼り付け、[ 実行] ボタンを選択します。

      しばらくすると、クエリの実行が完了し、Northwind データベースが作成されます。

データセットを保持する n 層ソリューションとクラス ライブラリを作成する (DataEntityTier)

このチュートリアルの最初の手順は、ソリューションと 2 つのクラス ライブラリ プロジェクトを作成することです。 最初のクラス ライブラリは、データセット (生成された型指定された DataSet クラスと、アプリケーションのデータを保持する DataTable) を保持します。 このプロジェクトは、アプリケーションのデータ エンティティ レイヤーとして使用され、通常は中間層に配置されます。 データセットは初期データセットを作成し、コードを 2 つのクラス ライブラリに自動的に分離します。

[OK] をクリックする前に、プロジェクトとソリューションに正しい名前を付けてください。 そうすることで、このチュートリアルを簡単に完了できます。

n 層ソリューションと DataEntityTier クラス ライブラリを作成するには

  1. Visual Studio で、C# または Visual Basic 用の Windows フォーム アプリ (.NET Framework) プロジェクト テンプレートを使用してプロジェクトを作成します。 .NET Core、.NET 5 以降はサポートされていません。

  2. プロジェクトに DataEntityTier という名前を付けます。

  3. ソリューションに NTierWalkthrough という名前を付け、[ OK] を選択します。

    DataEntityTier プロジェクトを含む NTierWalkthrough ソリューションが作成され、 ソリューション エクスプローラーに追加されます。

TableAdapters を保持するクラス ライブラリを作成する (DataAccessTier)

DataEntityTier プロジェクトを作成した後の次の手順は、別のクラス ライブラリ プロジェクトを作成することです。 このプロジェクトは、生成された TableAdapters を保持し、アプリケーションの データ アクセス層 と呼ばれます。 データ アクセス層には、データベースに接続するために必要な情報が含まれており、通常は中間層に配置されます。

TableAdapters 用の別のクラス ライブラリを作成するには

  1. ソリューション エクスプローラーでソリューションを右クリックし、[追加>新しいプロジェクト] を選択します。

  2. クラス ライブラリ (.NET Framework) プロジェクト テンプレートを選択します。

  3. プロジェクトに DataAccessTier という名前を付け、[ OK] を選択します

    DataAccessTier プロジェクトが作成され、NTierWalkthrough ソリューションに追加されます。

データセットを作成する

次の手順では、型指定されたデータセットを作成します。 型指定されたデータセットは、データセット クラス ( DataTables クラスを含む) と TableAdapter クラスの両方を使用して 1 つのプロジェクトに作成されます。 (すべてのクラスが 1 つのファイルに生成されます)。データセットと TableAdapters を別のプロジェクトに分割すると、そのデータセット クラスが他のプロジェクトに移動され、元のプロジェクトに TableAdapter クラスが残ります。 そのため、最終的に TableAdapters (DataAccessTier プロジェクト) を含むデータセットをプロジェクトに作成します。 データセットは、 データ ソース構成ウィザードを使用して作成します。

接続を作成するには、Northwind サンプル データベースにアクセスできる必要があります。 Northwind サンプル データベースを設定する方法については、「 方法: サンプル データベースをインストールする」を参照してください。

データセットを作成するには

  1. ソリューション エクスプローラーDataAccessTier を選択します。

  2. [ データ ] メニューの [ データ ソースの表示] を選択します。

    [ データ ソース] ウィンドウが開きます。

  3. [ データ ソース ] ウィンドウで、[ 新しいデータ ソースの追加 ] を選択して 、データ ソース構成ウィザードを開始します。

  4. [ データ ソースの種類の選択 ] ページで、[ データベース ] を選択し、[ 次へ] を選択します。

  5. [ データ接続の選択 ] ページで、次のいずれかの操作を実行します。

    Northwind サンプル データベースへのデータ接続がドロップダウン リストで使用できる場合は、それを選択します。

    または

    [ 新しい接続] を選択して、[ 接続の追加 ] ダイアログ ボックスを開きます。

  6. データベースにパスワードが必要な場合は、機密データを含めるオプションを選択し、[ 次へ] を選択します。

    (SQL Server に接続するのではなく) ローカル データベース ファイルを選択した場合は、プロジェクトにファイルを追加するかどうかを確認するメッセージが表示されることがあります。 プロジェクトにデータベース ファイルを追加するには、[ はい ] を選択します。

  7. [アプリケーション構成ファイルへの接続文字列の保存] ページで [次へ] を選択します。

  8. [データベース オブジェクトの選択] ページの [テーブル] ノードを展開します。

  9. Customers テーブルと Orders テーブルのチェック ボックスをオンにし、[完了] を選択します。

    NorthwindDataSet が DataAccessTier プロジェクトに追加され、[ データ ソース ] ウィンドウに表示されます。

TableAdapters をデータセットから分離する

データセットを作成したら、生成されたデータセット クラスを TableAdapters から分離します。 これを行うには、 DataSet Project プロパティを、分離されたデータセット クラスを格納するプロジェクトの名前に設定します。

TableAdapters をデータセットから分離するには

  1. ソリューション エクスプローラーNorthwindDataSet.xsd をダブルクリックして、データセット デザイナーでデータセットを開きます。

  2. デザイナーの空の領域を選択します。

  3. [プロパティ] ウィンドウで [DataSet Project] ノードを見つけます。

  4. DataSet プロジェクト の一覧で、 DataEntityTier を選択します。

  5. [ビルド] メニューの [ソリューションのビルド] を選択します。

    データセットと TableAdapters は、2 つのクラス ライブラリ プロジェクトに分割されます。 もともとデータセット全体 (DataAccessTier) を含んでいたプロジェクトに TableAdapters のみが含まれるようになりました。 DataSet Project プロパティ (DataEntityTier) で指定されたプロジェクトには、型指定されたデータセット (NorthwindDataSet.Dataset.Designer.vb (またはNorthwindDataSet.Dataset.Designer.cs) が含まれています。

データセットと TableAdapters を分離する場合 ( DataSet Project プロパティを設定することで)、プロジェクト内の既存の部分データセット クラスは自動的に移動されません。 既存のデータセット部分クラスは、データセット プロジェクトに手動で移動する必要があります。

新しいサービス アプリケーションを作成する

このチュートリアルでは、WCF サービスを使用してデータ アクセス層にアクセスする方法を示します。そのため、新しい WCF サービス アプリケーションを作成しましょう。

新しい WCF サービス アプリケーションを作成するには

  1. ソリューション エクスプローラーでソリューションを右クリックし、[追加>新しいプロジェクト] を選択します。

  2. [ 新しいプロジェクト ] ダイアログ ボックスの左側のウィンドウで、[ WCF] を選択します。 中央のウィンドウで、[ WCF サービス ライブラリ] を選択します。

  3. プロジェクトに DataService という名前を 付け 、[ OK] を選択します。

    DataService プロジェクトが作成され、NTierWalkthrough ソリューションに追加されます。

顧客と注文データを返すメソッドをデータ アクセス層に作成する

データ サービスは、データ アクセス層で 2 つのメソッド ( GetCustomersGetOrders) を呼び出す必要があります。 これらのメソッドは、Northwind Customers テーブルと Orders テーブルを返します。 GetCustomers プロジェクトにGetOrdersメソッドとDataAccessTier メソッドを作成します。

Customers テーブルを返すメソッドをデータ アクセス層に作成するには

  1. ソリューション エクスプローラーでNorthwindDataset.xsd をダブルクリックしてデータセットを開きます。

  2. CustomersTableAdapter を右クリックし、[クエリの追加] をクリックします。

  3. [ コマンドの種類の選択 ] ページで、[ SQL ステートメントの使用 ] の既定値のままにして、[ 次へ] をクリックします。

  4. [ クエリの種類の選択 ] ページで、 行を返す SELECT の既定値をそのままにして、[ 次へ] をクリックします。

  5. [ SQL SELECT ステートメントの指定 ] ページで、既定のクエリをそのまま使用し、[ 次へ] をクリックします。

  6. [生成するメソッドの選択] ページで、[DataTable を返す] セクションのメソッド名「GetCustomers」と入力します。

  7. [完了] をクリックします。

Orders テーブルを返すメソッドをデータ アクセス層に作成するには

  1. OrdersTableAdapter を右クリックし、[クエリの追加] をクリックします。

  2. [ コマンドの種類の選択 ] ページで、[ SQL ステートメントの使用 ] の既定値のままにして、[ 次へ] をクリックします。

  3. [ クエリの種類の選択 ] ページで、 行を返す SELECT の既定値をそのままにして、[ 次へ] をクリックします。

  4. [ SQL SELECT ステートメントの指定 ] ページで、既定のクエリをそのまま使用し、[ 次へ] をクリックします。

  5. [生成するメソッドの選択] ページで、[DataTable の返却]セクションのメソッド名[GetOrders]と入力します。

  6. [完了] をクリックします。

  7. [ビルド] メニューの [ソリューションのビルド] をクリックします。

データ エンティティとデータ アクセス層への参照をデータ サービスに追加する

データ サービスにはデータセットと TableAdapters からの情報が必要であるため、 DataEntityTier プロジェクトと DataAccessTier プロジェクトへの参照を追加します。

データ サービスへの参照を追加するには

  1. ソリューション エクスプローラーDataService を右クリックし、[参照の追加] をクリックします。

  2. [参照の追加] ダイアログ ボックスの [プロジェクト] タブをクリックします。

  3. DataAccessTier プロジェクトと DataEntityTier プロジェクトの両方を選択します。

  4. OK をクリックします。

データ アクセス層で GetCustomers メソッドと GetOrders メソッドを呼び出す関数をサービスに追加する

データ アクセス層にデータを返すメソッドが含まれるようになったので、データ アクセス層のメソッドを呼び出すメソッドをデータ サービスに作成します。

C# プロジェクトの場合は、次のコードをコンパイルするために、 System.Data.DataSetExtensions アセンブリへの参照を追加する必要があります。

データ サービスで GetCustomers 関数と GetOrders 関数を作成するには

  1. DataService プロジェクトで、IService1.vbまたはIService1.csをダブルクリックします。

  2. [ サービス操作をここに追加 する] コメントの下に次のコードを追加します。

    [OperationContract]
    DataEntityTier.NorthwindDataSet.CustomersDataTable GetCustomers();
    
    [OperationContract]
    DataEntityTier.NorthwindDataSet.OrdersDataTable GetOrders();
    

    このチュートリアルのコードは、C# と Visual Basic で使用できます。 このページのコード言語を C# と Visual Basic の間で切り替えるには、右側のページの上部にあるコード言語スイッチャーを使用します。

  3. DataService プロジェクトで、 Service1.vb (または Service1.cs) をダブルクリックします。

  4. Service1 クラスに次のコードを追加します。

    public DataEntityTier.NorthwindDataSet.CustomersDataTable GetCustomers()
    {
        DataAccessTier.NorthwindDataSetTableAdapters.CustomersTableAdapter
             CustomersTableAdapter1
            = new DataAccessTier.NorthwindDataSetTableAdapters.CustomersTableAdapter();
        return CustomersTableAdapter1.GetCustomers();
    }
    public DataEntityTier.NorthwindDataSet.OrdersDataTable GetOrders()
    {
        DataAccessTier.NorthwindDataSetTableAdapters.OrdersTableAdapter
             OrdersTableAdapter1
            = new DataAccessTier.NorthwindDataSetTableAdapters.OrdersTableAdapter();
        return OrdersTableAdapter1.GetOrders();
    }
    
  5. [ビルド] メニューの [ソリューションのビルド] をクリックします。

データ サービスからのデータを表示するプレゼンテーション層を作成する

ソリューションにデータ アクセス層を呼び出すメソッドを含むデータ サービスが含まれるようになったので、データ サービスを呼び出してユーザーにデータを提示する別のプロジェクトを作成します。 このチュートリアルでは、Windows フォーム アプリケーションを作成します。これは n 層アプリケーションのプレゼンテーション層です。

プレゼンテーション層プロジェクトを作成するには

  1. ソリューション エクスプローラーでソリューションを右クリックし、[追加>新しいプロジェクト] を選択します。

  2. [ 新しいプロジェクト ] ダイアログ ボックスの左側のウィンドウで、[ Windows デスクトップ] を選択します。 中央のウィンドウで、[ Windows フォーム アプリ] を選択します。

  3. プロジェクトに PresentationTier という名前を付け、[ OK] をクリックします。

    PresentationTier プロジェクトが作成され、NTierWalkthrough ソリューションに追加されます。

PresentationTier プロジェクトをスタートアップ プロジェクトとして設定する

PresentationTier プロジェクトは、データを提示して操作する実際のクライアント アプリケーションであるため、ソリューションのスタートアップ プロジェクトに設定します。

新しいプレゼンテーション層プロジェクトをスタートアップ プロジェクトとして設定するには

  • ソリューション エクスプローラーで、[PresentationTier] を右クリックし、[スタートアップ プロジェクトとして設定] をクリックします。

プレゼンテーション層への参照の追加

クライアント アプリケーション PresentationTier では、サービス内のメソッドにアクセスするために、データ サービスへのサービス参照が必要です。 さらに、WCF サービスによる型共有を有効にするには、データセットへの参照が必要です。 データ サービスを介して型の共有を有効にするまで、部分データセット クラスに追加されたコードはプレゼンテーション層では使用できません。 通常、データ テーブルの行や列の変更イベントに検証コードなどのコードを追加するため、クライアントからこのコードにアクセスすることが必要になる可能性があります。

プレゼンテーション層への参照を追加するには

  1. ソリューション エクスプローラーでPresentationTier を右クリックし、[参照の追加] を選択します。

  2. [ 参照の追加 ] ダイアログ ボックスで、[ プロジェクト ] タブを選択します。

  3. [DataEntityTier] を選択し、[OK] を選択します

プレゼンテーション層にサービス参照を追加するには

  1. ソリューション エクスプローラーでPresentationTier を右クリックし、[サービス参照の追加] を選択します。

  2. [ サービス参照の追加 ] ダイアログ ボックスで、[ 検出] を選択します。

  3. [Service1] を選択し、[OK] を選択します

    現在のコンピューターに複数のサービスがある場合は、このチュートリアルで前に作成したサービス ( GetCustomers メソッドと GetOrders メソッドを含むサービス) を選択します。

DataGridViews をフォームに追加して、データ サービスから返されたデータを表示します

データ サービスにサービス参照を追加すると、[ データ ソース] ウィンドウに、サービスによって返されるデータが自動的に設定されます。

2 つのデータバウンドされた DataGridView をフォームに追加するには

  1. ソリューション エクスプローラーでPresentationTier プロジェクトを選択します。

  2. [ データ ソース ] ウィンドウで、[ NorthwindDataSet ] を展開し、[ 顧客 ] ノードを見つけます。

  3. [顧客] ノードを Form1 にドラッグします。

  4. [データ ソース] ウィンドウで、[顧客] ノードを展開し、関連する [注文] ノード ([顧客] ノードに入れ子になった [注文] ノード) を見つけます。

  5. 関連する Orders ノードを Form1 にドラッグします。

  6. フォームの空の領域をダブルクリックして、 Form1_Load イベント ハンドラーを作成します。

  7. Form1_Load イベント ハンドラーに次のコードを追加します。

    ServiceReference1.Service1Client DataSvc =
        new ServiceReference1.Service1Client();
    northwindDataSet.Customers.Merge(DataSvc.GetCustomers());
    northwindDataSet.Orders.Merge(DataSvc.GetOrders());
    

サービスで許可されるメッセージの最大サイズを増やす

maxReceivedMessageSizeの既定値は、CustomersテーブルとOrders テーブルから取得されたデータを保持するのに十分な大きさではありません。 次の手順では、値を 6553600 に増やします。 クライアントの値を変更すると、サービス参照が自動的に更新されます。

既定のサイズを小さくすると、サービス拒否 (DoS) 攻撃への露出が制限されます。 詳細については、MaxReceivedMessageSizeを参照してください。

maxReceivedMessageSize の値を増やすには

  1. ソリューション エクスプローラーでPresentationTier プロジェクトの app.config ファイルをダブルクリックします。

  2. maxReceivedMessageSize 属性を見つけて、値を 6553600 に変更します。 basicHttpBindingエントリが表示されない場合は、次の例のようにエントリを追加します。

    <system.serviceModel>
     <bindings>
         <basicHttpBinding>
             <binding maxBufferSize="6553600" maxReceivedMessageSize="6553600" />
         </basicHttpBinding>
     </bindings>
    </system.serviceModel>
    

アプリケーションをテストする

F5 キーを押してアプリケーションを実行します。 CustomersテーブルとOrders テーブルのデータは、データ サービスから取得され、フォームに表示されます。

次のステップ

アプリケーションの要件に応じて、関連するデータを Windows ベースのアプリケーションに保存した後に実行する必要がある手順がいくつかあります。 たとえば、このアプリケーションに対して次の機能強化を行うことができます。

  • データセットに検証を追加します。

  • データをデータベースに更新するためのメソッドをサービスに追加します。