Share via


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

Note

データセットと関連クラスは、アプリケーションがデータベースから切断されている間にアプリケーションがメモリ内のデータを操作できるようにする、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 サービスと 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 インスタンスを右クリックし、 [新しいクエリ] を選択します。

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

    2. Northwind Transact-SQL スクリプトをクリップボードにコピーします。 この T-SQL スクリプトを使用すると、Northwind データベースが新規作成され、データが設定されます。

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

      しばらくすると、クエリの実行が完了し、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) を作成する

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

注意

[OK] をクリックする前に、必ずプロジェクトとソリューションに適切な名前を付けてください。 これにより、チュートリアルの完了が容易になります。

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

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

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

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

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

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

DataEntityTier プロジェクトを作成したら、次に、クラス ライブラリ プロジェクトをもう 1 つ作成します。 このプロジェクトは、生成された TableAdapter を保持し、アプリケーションの "データ アクセス層" と呼ばれます。 データ アクセス層は、データベースへの接続に必要な情報を格納し、通常、中間層に置かれます。

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

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

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

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

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

データセットを作成する

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

注意

接続を作成するには、Northwind サンプル データベースへのアクセス権を持っている必要があります。 Northwind サンプル データベースの設定の詳細については、サンプル データベースをインストールする方法に関する記事を参照してください。

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

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

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

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

  3. [データ ソース] ウィンドウで、 [新しいデータ ソースの追加] をクリックしてデータ ソース構成ウィザードを起動します。

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

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

    Northwind サンプル データベースへのデータ接続がドロップダウン リストに表示されている場合は選択します。

    または

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

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

    注意

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

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

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

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

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

データセットと TableAdapter を分離する

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

データセットと TableAdapter を分離するには

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

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

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

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

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

    データセットと TableAdapter が、2 つのクラス ライブラリ プロジェクトに分離されます。 最初にデータセット全体 (DataAccessTier) が含まれていたプロジェクトに、現在は TableAdapter しか含まれません。 [DataSet プロジェクト] プロパティで指定したプロジェクト (DataEntityTier) には、型指定されたデータセット NorthwindDataSet.Dataset.Designer.vb (または NorthwindDataSet.Dataset.Designer.cs) が含まれます。

Note

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

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

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

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

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

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

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

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

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

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

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. [ビルド] メニューの [ソリューションのビルド] をクリックします。

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

データ サービスはデータセットと TableAdapter の情報を必要とするため、DataEntityTier プロジェクトおよび DataAccessTier プロジェクトへの参照を追加します。

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

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

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

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

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

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

これで、データを返すメソッドをデータ アクセス層に含めることができました。次に、データ サービスにメソッドを作成して、データ アクセス層のメソッドを呼び出します。

Note

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

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

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

  2. [Add your service operations here] というコメントの下に、次のコードを追加します。

    [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 メソッドを含むサービス) を選択します。

データ サービスから返されたデータを表示するための DataGridView をフォームに追加する

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

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

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

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

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

  4. [データ ソース] ウィンドウの [Customers] ノードを展開し、関連する [Orders] ノード ([Customers] ノードに入れ子になっている [Orders] ノード) を見つけます。

  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 テーブルから取得したデータを保持するのに十分な大きさではありません。 次の手順では、その値を 6,553,600 に増やします。 クライアントで値を変更すると、サービス参照が自動的に更新されます。

Note

既定のサイズが低く設定されているのは、サービス拒否 (DoS) 攻撃を受けるリスクを低減するためです。 詳細については、「MaxReceivedMessageSize」を参照してください。

maxReceivedMessageSize 値を増やすには

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

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

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

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

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

次のステップ

Windows ベース アプリケーションに関連データを保存した後で、アプリケーションの要件によってはさらに操作を追加する必要があります。 たとえば、このアプリケーションに対して次のような拡張を行うことができます。

  • データセットへの検証の追加。

  • サービスへの、データを更新してデータベースに戻す追加メソッドの追加。