Procédure pas à pas : créer une application de données n-tiers avec ADO.NET et .NET Framework

Remarque

Les jeux de données et les classes associées sont des technologies .NET Framework héritées qui datent du début des années 2000. Elles permettent aux applications d’utiliser des données en mémoire pendant que les applications sont déconnectées de la base de données. Elles sont particulièrement utiles aux applications qui permettent aux utilisateurs de modifier des données, et de rendre ces changements persistants dans la base de données. Même si les jeux de données sont une technologie très efficace, nous vous recommandons d’utiliser Entity Framework Core pour les nouvelles applications .NET. Entity Framework offre un moyen plus naturel d’utiliser des données tabulaires en tant que modèles objet. De plus, il présente une interface de programmation plus simple.

Les applications de données multiniveaux sont des applications qui accèdent aux données et sont divisées en plusieurs couches logiques, ou niveaux. La séparation des composants de l'application en couches distinctes favorise la possibilité de tenir à jour et de monter en charge l'application. Cela est possible grâce à une application plus facile des nouvelles technologies sur chaque couche sans avoir à reconcevoir toute la solution. L'architecture multicouche inclut une couche Présentation, une couche intermédiaire et une couche Données. La couche intermédiaire inclut généralement une couche d’accès aux données, une couche logique métier et des composants partagés tels que l’authentification et la validation. La couche Données inclut une base de données relationnelle. Les applications multicouches stockent généralement les informations sensibles dans la couche d'accès aux données de la couche intermédiaire, pour la tenir hors de portée des utilisateurs finaux qui accèdent à la couche Présentation. Pour plus d’informations, consultez Vue d’ensemble des applications de données multiniveaux.

Pour séparer plusieurs couches d'une application multicouche, il est possible de créer des projets distincts pour chaque couche que vous voulez inclure dans votre application. Les datasets typés contiennent une propriété DataSet Project qui détermine les projets dans lesquels le code du dataset et des TableAdapters générés doit intervenir.

Cette procédure pas à pas décrit comment séparer le code du dataset et TableAdapter en projets de bibliothèque de classes discrètes à l’aide du Concepteur de DataSet. Après avoir séparé le jeu de données et le code TableAdapter, vous créez une instance de Services Windows Communication Foundation et services de données WCF dans Visual Studio pour appeler le niveau d’accès aux données. Enfin, vous créez une application Windows Forms en tant que couche Présentation. Cette couche accède aux données à partir du service de données.

Dans cette procédure pas à pas, vous suivrez les étapes suivantes :

  • Créez une solution multiniveau qui contient plusieurs projets.

  • ajouter deux projets de bibliothèque de classes à la solution multicouche ;

  • Créez un dataset typé à l’aide de l’Assistant Configuration de source de données.

  • diviser le code du jeu de données et des TableAdapters générés en projets distincts.

  • créer un service WCF (Windows Communication Foundation) pour appeler la couche d'accès aux données ;

  • créer des fonctions dans le service pour récupérer les données de la couche d'accès aux données ;

  • créer une application Windows Forms faisant office de couche Présentation ;

  • créer des contrôles Windows Forms liés à la source de données ;

  • écrire du code pour remplir les tables de données.

Prérequis

Pour effectuer ce tutoriel, vous devez installer les charges de travail Développement de bureau .NET et Stockage et traitement des données dans Visual Studio. Pour les installer, ouvrez Visual Studio Installer et choisissez Modifier (ou Plus>Modifier) en regard de la version de Visual Studio que vous souhaitez modifier. Consultez Modifier Visual Studio.

Cette procédure pas à pas utilise SQL Server Express LocalDB et l’exemple de base de données Northwind.

  1. Si vous n’avez pas SQL Server Express LocalDB, installez-la à partir de la page de téléchargement de SQL Server Express ou via Visual Studio Installer. Dans Visual Studio Installer, vous pouvez installer SQL Server Express LocalDB dans le cadre de la charge de travail Développement .NET Desktop, ou l’installer comme un composant seul.

  2. Installez l’exemple de base de données Northwind en procédant comme suit :

    1. Dans Visual Studio, ouvrez la fenêtre de l’Explorateur d’objets SQL Server. (L’Explorateur d’objets SQL Server est installé dans le cadre de la charge de travail stockage de données et du traitement dans Visual Studio Installer.) Développez le nœud SQL Server. Cliquez avec le bouton droit sur votre instance LocalDB et sélectionnez Nouvelle requête.

      Une fenêtre d’éditeur de requête s’ouvre.

    2. Copiez le script Northwind Transact-SQL dans votre Presse-papiers. Ce script T-SQL crée la base de données Northwind à partir de zéro et la remplit avec des données.

    3. Collez le script T-SQL dans l’éditeur de requête, puis cliquez sur le bouton Exécuter.

      Après un court laps de temps, la requête se termine et la base de données Northwind est créée.

    1. Dans Visual Studio, ouvrez la fenêtre de l’Explorateur d’objets SQL Server. (L’Explorateur d’objets SQL Server est installé dans le cadre de la charge de travail stockage de données et du traitement dans Visual Studio Installer.) Développez le nœud SQL Server. Cliquez avec le bouton droit sur votre instance LocalDB et sélectionnez Nouvelle requête.

      Si vous ne voyez pas l’instance LocalDB, utilisez le bouton de barre d’outils Ajouter SQL Server. La boîte de dialogue s’affiche. Dans la boîte de dialogue, développez Local et choisissez MSSQLLocalDB. Entrez les informations d’identification appropriées. Vous pouvez conserver le choix par défaut pour la base de données.

      Capture d’écran de la boîte de dialogue Se connecter à SQL Database

    2. Choisissez Connexion. Un nœud est ajouté pour LocalDB dans l’Explorateur d’objets SQL Server.

    3. Cliquez avec le bouton droit sur votre instance LocalDB et sélectionnez Nouvelle requête.

      Une fenêtre d’éditeur de requête s’ouvre.

    4. Copiez le script Northwind Transact-SQL dans votre Presse-papiers. Ce script T-SQL crée la base de données Northwind à partir de zéro et la remplit avec des données.

    5. Collez le script T-SQL dans l’éditeur de requête, puis cliquez sur le bouton Exécuter.

      Après un court laps de temps, la requête se termine et la base de données Northwind est créée.

Créer la solution multiniveau et la bibliothèque de classes pour contenir le jeu de données (DataEntityTier)

La première étape de cette procédure pas à pas consiste à créer une solution et deux projets de bibliothèque de classes. La première bibliothèque de classes contient le jeu de données (la classe typée DataSet générée et les DataTables qui contiennent les données de l’application). Ce projet est utilisé comme couche d'entité de données de l'application et figure généralement dans la couche intermédiaire. Le jeu de données est utilisé pour créer le jeu de données initial et diviser automatiquement le code en deux bibliothèques de classes.

Notes

Nommez correctement le projet et la solution avant de cliquer sur OK. Il vous sera alors plus facile de terminer cette procédure pas à pas.

Pour créer la solution multicouche et la bibliothèque de classes DataEntityTier

  1. Dans Visual Studio, créez un projet à l’aide du modèle de projet Application Windows Forms (.NET Framework) pour C# ou Visual Basic. .NET Core, .NET 5 et versions ultérieures ne sont pas pris en charge.

  2. Nommez le projet DataEntityTier.

  3. Nommez la solution NTierWalkthrough, puis choisissez OK.

    Une solution NTierWalkthrough contenant le projet DataEntityTier est créée et ajoutée à l’Explorateur de solutions.

Créer la bibliothèque de classes pour contenir les TableAdapters (DataAccessTier)

L'étape qui suit la création du projet DataEntityTier est la création d'un autre projet de bibliothèque de classes. Ce projet contient les TableAdapters typés et représente la couche d’accès aux données de l’application. La couche d'accès aux données contient les informations requises pour se connecter à la base de données et figure généralement dans la couche intermédiaire.

Pour créer une bibliothèque de classes distincte pour les TableAdapters

  1. Cliquez avec le bouton droit sur la solution dans l’Explorateur de solutions, puis choisissez Ajouter>Nouveau projet.

  2. Choisissez le modèle de projet Bibliothèque de classes (.NET Framework).

  3. Attribuez le nom DataAccessTier au projet et choisissez OK.

    Le projet DataAccessTier est créé et ajouté à la solution NTierWalkthrough.

Créer le jeu de données

L'étape qui suit consiste à créer le dataset typé. Les jeux de données typés sont créés avec la classe DataSet (y compris les classes DataTables) et les classes TableAdapter dans un projet unique. (Toutes les classes sont générées dans un seul fichier.) Quand vous séparez le jeu de données et les TableAdapters dans des projets différents, la classe DataSet est déplacée dans l’autre projet et les classes TableAdapter restent dans le projet d’origine. Par conséquent, créez le jeu de données dans le projet qui contiendra les TableAdapters (le projet DataAccessTier). Créez le jeu de données à l’aide de l'Assistant Configuration de source de données.

Notes

Vous devez avoir accès à l'exemple de base de données Northwind pour créer la connexion. Pour plus d’informations sur la configuration de l’exemple de base de données Northwind, consultez Guide pratique pour installer des exemples de bases de données.

Pour créer le dataset

  1. Sélectionnez DataAccessTier dans l’Explorateur de solutions.

  2. Dans le menu Données, sélectionnez Afficher les sources de données.

    La fenêtre Sources de données s’ouvre.

  3. Dans la fenêtre Sources de données, sélectionnez Ajouter une nouvelle source de données pour démarrer l’Assistant Configuration de source de données.

  4. Dans la page Choisir un type de source de données, sélectionnez Base de données, puis Suivant.

  5. Dans la page Choisir votre connexion de données, effectuez l’une des opérations suivantes :

    Si une connexion de données à l'exemple de base de données Northwind est disponible dans la liste déroulante, sélectionnez-la.

    or

    Sélectionnez Nouvelle connexion pour ouvrir la boîte de dialogue Ajouter une connexion.

  6. Si la base de données requiert un mot de passe, sélectionnez l’option permettant d’inclure les données sensibles, puis choisissez Suivant.

    Notes

    Si vous avez sélectionné un fichier de base de données local (au lieu de vous connecter à SQL Server), il vous sera peut-être demandé si vous souhaitez ajouter le fichier au projet. Choisissez Oui pour ajouter le fichier de base de données au projet.

  7. Sélectionnez Suivant dans la page Enregistrer la chaîne de connexion dans le fichier de configuration de l’application.

  8. Développez le nœud Tables dans la page Choisir vos objets de base de données .

  9. Cochez les cases correspondant aux tables Customers et Orders, puis choisissez Terminer.

    NorthwindDataSet est ajouté au projet DataAccessTier et apparaît dans la fenêtre Sources de données.

Séparer les TableAdapters du jeu de données

Une fois que vous avez créé le dataset, séparez la classe DataSet générée et les TableAdapters. Pour ce faire, définissez la propriété Projet DataSet sur le nom du projet dans lequel stocker la classe DataSet extraite.

Pour séparer les TableAdapters du dataset

  1. Double-cliquez sur NorthwindDataSet.xsd dans l’Explorateur de solutions pour ouvrir le dataset dans le Concepteur de DataSet.

  2. Sélectionnez une zone vide du concepteur.

  3. Recherchez le nœud Projet DataSet dans la fenêtre Propriétés.

  4. Dans la liste DataSet Project, sélectionnez DataEntityTier.

  5. Dans le menu Générer, sélectionnez Générer la solution.

    Le dataset et les TableAdapters sont divisés entre les deux projets de bibliothèque de classes. Le projet qui contenait initialement l’intégralité du jeu de données (DataAccessTier) ne contient désormais que les TableAdapters. Le projet désigné dans la propriété DataSet Project (DataEntityTier) contient le jeu de données typé : NorthwindDataSet.Dataset.Designer.vb (ou NorthwindDataSet.Dataset.Designer.cs).

Notes

Quand vous séparez les datasets et les TableAdapters (en définissant la propriété Projet DataSet), les classes DataSet partielles existantes dans le projet ne sont pas déplacées automatiquement. Les classes DataSet partielles existantes doivent être manuellement déplacées dans le projet DataSet.

Créer une nouvelle application de service

Cette procédure pas à pas décrit comment accéder à la couche d’accès aux données à l’aide d’un service WCF, créons donc une application de service WCF.

Pour créer une application de service WCF

  1. Cliquez avec le bouton droit sur la solution dans l’Explorateur de solutions, puis choisissez Ajouter>Nouveau projet.

  2. Dans la boîte de dialogue Nouveau projet, dans le volet gauche, sélectionnez WCF. Dans le volet central, sélectionnez Bibliothèque de services WCF.

  3. Attribuez le nom DataService au projet et sélectionnez OK.

    Le projet DataService est créé et ajouté à la solution NTierWalkthrough.

Créer des méthodes dans le niveau d’accès aux données pour retourner les données des clients et des commandes

Le service de données doit appeler deux méthodes de la couche d’accès aux données : GetCustomers et GetOrders. Ces méthodes retournent les tables Northwind Customers et Orders. Créez les méthodes GetCustomers et GetOrders dans le projet DataAccessTier.

Pour créer une méthode dans la couche d'accès aux données qui retourne la table Customers

  1. Dans l'Explorateur de solutions, double-cliquez sur NorthwindDataset.xsd pour ouvrir le jeu de données.

  2. Cliquez avec le bouton droit sur CustomersTableAdapter et cliquez sur Ajouter une requête.

  3. Dans la page Choisir un type de commande, conservez la valeur par défaut Utiliser des instructions SQL, puis cliquez sur Suivant.

  4. Dans la page Choisir un type de requête, conservez la valeur par défaut SELECT qui retourne des lignes, puis cliquez sur Suivant.

  5. Dans la page Spécifier une instruction SQL SELECT, conservez la requête par défaut et cliquez sur Suivant.

  6. Dans la page Choisir les méthodes à générer, tapez GetCustomers dans le champ Nom de la méthode de la section Retourner un DataTable.

  7. Cliquez sur Terminer.

Pour créer une méthode dans la couche d'accès aux données qui retourne la table Orders

  1. Cliquez avec le bouton droit sur OrdersTableAdapter, puis cliquez sur Ajouter une requête.

  2. Dans la page Choisir un type de commande, conservez la valeur par défaut Utiliser des instructions SQL, puis cliquez sur Suivant.

  3. Dans la page Choisir un type de requête, conservez la valeur par défaut SELECT qui retourne des lignes, puis cliquez sur Suivant.

  4. Dans la page Spécifier une instruction SQL SELECT, conservez la requête par défaut et cliquez sur Suivant.

  5. Dans la page Choisir les méthodes à générer, tapez GetOrders dans le champ Nom de la méthode de la section Retourner un DataTable.

  6. Cliquez sur Terminer.

  7. Dans le menu Générer, cliquez sur Générer la solution.

Ajouter une référence aux niveaux d’entité de données et d’accès aux données au service de données

Le service de données nécessitant des informations du dataset et des TableAdapters, ajoutez des références aux projets DataEntityTier et DataAccessTier.

Pour ajouter des références au service de données

  1. Cliquez avec le bouton droit sur DataService dans l’Explorateur de solutions, puis cliquez sur Ajouter une référence.

  2. Cliquez sur l’onglet Projets de la boîte de dialogue Ajouter une référence.

  3. Sélectionnez à la fois les projets DataAccessTier et DataEntityTier.

  4. Cliquez sur OK.

Ajouter des fonctions au service pour appeler les méthodes GetCustomers et GetOrders dans le niveau d’accès aux données

Maintenant que la couche d'accès aux données contient les méthodes permettant de retourner les données, créez des méthodes dans le service de données pour appeler les méthodes dans la couche d'accès aux données.

Notes

Pour les projets C#, vous devez ajouter une référence à l'assembly System.Data.DataSetExtensions pour la compilation du code suivant.

Pour créer les fonctions GetCustomers et GetOrders dans le service de données

  1. Dans le projet DataService, double-cliquez sur IService1.vb ou sur IService1.cs.

  2. Ajoutez le code suivant sous le commentaire Ajoutez vos opérations de service ici :

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

    Notes

    Le code de ce tutoriel est disponible en C# et Visual Basic. Pour basculer le langage de programmation de cette page entre C# et Visual Basic, utilisez le sélecteur de langage en haut de la page sur le côté droit.

  3. Dans le projet DataService, double-cliquez sur Service1.vb (ou sur Service1.cs).

  4. Ajoutez le code suivant à la classe 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. Dans le menu Générer, cliquez sur Générer la solution.

Créer un niveau de présentation pour afficher les données du service de données

Maintenant que la solution contient le service de données avec les méthodes permettant d’appeler la couche d’accès aux données, créez un autre projet pour appeler le service de données et présenter les données aux utilisateurs. Pour cette procédure pas à pas, créez une application Windows Forms. Il s’agit de la couche Présentation de l’application multicouche.

Pour créer le projet de couche Présentation

  1. Cliquez avec le bouton droit sur la solution dans l’Explorateur de solutions, puis choisissez Ajouter>Nouveau projet.

  2. Dans la boîte de dialogue Nouveau projet, dans le volet gauche, sélectionnez Windows Desktop. Dans le volet central, sélectionnez Application Windows Forms.

  3. Nommez le projet PresentationTier et cliquez sur OK.

    Le projet PresentationTier est créé et ajouté à la solution NTierWalkthrough.

Définir le projet PresentationTier comme projet de démarrage

Nous allons définir le projet PresentationTier comme projet de démarrage de la solution, car c’est l’application cliente réelle qui présente les données et interagit avec.

Pour définir le nouveau projet de niveau Présentation comme projet de démarrage

  • Dans l’Explorateur de solutions, cliquez avec le bouton droit sur PresentationTier, puis cliquez sur Définir comme projet de démarrage.

Ajout de références à la couche Présentation

L’application cliente PresentationTier nécessite une référence de service au service de données pour accéder aux méthodes du service. Par ailleurs, une référence au dataset est requise pour activer le partage de type par le service WCF. Tant que vous n’activez pas le partage de type via le service de données, le code ajouté à la classe DataSet partielle n’est pas disponible dans la couche Présentation. Comme généralement vous ajoutez du code, comme pour la validation aux événements de modification de ligne et de colonne d’une table de données, vous voudrez probablement accéder à ce code depuis le client.

Pour ajouter une référence à la couche Présentation

  1. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur PresentationTier et sélectionnez Ajouter une référence.

  2. Dans la boîte de dialogue Ajouter une référence, sélectionnez l’onglet Projets.

  3. Sélectionnez DataEntityTier et choisissez OK.

Pour ajouter une référence de service à la couche Présentation

  1. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur PresentationTier et sélectionnez Ajouter une référence de service.

  2. Dans la boîte de dialogue Ajouter une référence de service, sélectionnez Découvrir.

  3. Sélectionnez Service1 et choisissez OK.

    Notes

    Si vous disposez de plusieurs services sur l’ordinateur actuel, sélectionnez le service que vous avez créé précédemment dans cette procédure pas à pas (le service contenant les méthodes GetCustomers et GetOrders).

Ajouter DataGridViews au formulaire pour afficher les données retournées par le service de données

Une fois que vous avez ajouté la référence de service au service de données, la fenêtre Sources de données est automatiquement remplie avec les données retournées par le service.

Pour ajouter au formulaire deux DataGridViews liés aux données

  1. Dans l’Explorateur de solutions, sélectionnez le projet PresentationTier.

  2. Dans la fenêtre Sources de données, développez NorthwindDataSet et accédez au nœud Customers.

  3. Faites glisser le nœud Customers vers Form1.

  4. Dans la fenêtre Sources de données, développez le nœud Customers et accédez au nœud Orders associé (le nœud Orders imbriqué dans le nœud Customers).

  5. Faites glisser le nœud Orders associé vers Form1.

  6. Créez un gestionnaire d'événements Form1_Load en double-cliquant sur une zone vide du formulaire.

  7. Ajoutez le code ci-après au gestionnaire d'événements Form1_Load.

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

Augmenter la taille maximale de message autorisée par le service

La valeur par défaut de maxReceivedMessageSize n’est pas suffisamment grande pour contenir les données récupérées à partir des tables Customers et Orders. Dans les étapes suivantes, vous allez augmenter la valeur à 6553600. Vous allez modifier la valeur sur le client, ce qui mettra automatiquement à jour la référence de service.

Notes

La taille inférieure par défaut est destinée à limiter l'exposition aux attaques par déni de service. Pour plus d’informations, consultez MaxReceivedMessageSize.

Pour augmenter la valeur de maxReceivedMessageSize

  1. Dans l’Explorateur de solutions, double-cliquez sur le fichier app.config du projet PresentationTier.

  2. Accédez à l’attribut maxReceivedMessageSize et changez la valeur en 6553600. Si vous ne voyez pas l’entrée basicHttpBinding, ajoutez-en une comme dans l’exemple suivant :

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

Test de l’application

Exécutez l’application en appuyant sur F5. Les données des tables Customers et Orders sont récupérées à partir du service de données et affichées dans le formulaire.

Étapes suivantes

Selon les spécifications de votre application, vous pouvez exécuter différentes étapes après avoir enregistré les données associées dans l'application Windows. Par exemple, vous pouvez apporter les améliorations suivantes à cette application :

  • Ajouter une validation au dataset.

  • Ajouter des méthodes supplémentaires au service pour la mise à jour des données dans la base de données.