L'application WinForm et le composant d'accès aux données



Documents pareils
ADO.NET. Ado.net propose deux modes d'accès, le mode connecté et le mode déconnecté.

1. Introduction Création d'une macro autonome Exécuter la macro pas à pas Modifier une macro... 5

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Création d'un site dynamique en PHP avec Dreamweaver et MySQL

Paginer les données côté serveur, mettre en cache côté client

La gestion des boîtes aux lettres partagées

Déploiement d'une application Visual Studio Lightswitch dans Windows Azure.

Didacticiel de mise à jour Web

Débuter avec OOo Base

UTILISATION DE L'APPLICATION «PARTAGE DE FICHIERS EN LIGNE»

PRODIGE V3. Manuel utilisateurs. Consultation des métadonnées

MODE OPERATOIRE OPENOFFICE BASE

MEDIAplus elearning. version 6.6

Guide de démarrage rapide Centre de copies et d'impression Bureau en Gros en ligne

Créer un rapport pour Reporting Services

Procédures Stockées WAVESOFT ws_sp_getidtable Exemple : ws_sp_getnextsouche Exemple :... 12

A - Créer une Base de données au format dbase

1. Introduction Création d'une requête...2

Classe ClInfoCGI. Fonctions membres principales. Gestion des erreurs

Sage CRM. 7.2 Guide de Portail Client

BTS S.I.O PHP OBJET. Module SLAM4. Nom du fichier : PHPRévisionObjetV2.odt Auteur : Pierre Barais

SYNC FRAMEWORK AVEC SQLITE POUR APPLICATIONS WINDOWS STORE (WINRT) ET WINDOWS PHONE 8

Date de diffusion : Rédigé par : Version : Mars 2008 APEM 1.4. Sig-Artisanat : Guide de l'utilisateur 2 / 24

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Guide Utilisateur - Guide général d'utilisation du service via Zdesktop ou Webmail v.8. Powered by. Version EXOCA 1

Stockage du fichier dans une table mysql:

I La création d'un compte de messagerie Gmail.

Alfresco Guide Utilisateur

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

1. Utilisation du logiciel Keepass

COMMANDES SQL... 2 COMMANDES DE DEFINITION DE DONNEES... 2

Le générateur d'activités

Le modèle de données

Le meilleur de l'open source dans votre cyber cafe

Création d'un questionnaire (sondage)

Edutab. gestion centralisée de tablettes Android

Guide Utilisateur - Guide général d'utilisation du service via Zdesktop ou Webmail v.8. Powered by. - media-2001.communication &.

Introduction à JDBC. Accès aux bases de données en Java

SOMMAIRE. Travailler avec les requêtes... 3

Manuel d'utilisation d'apimail V3

1. Base de données SQLite

Connexion à une base de données. Connexion à une base de données. Connexion à une base de données Développement d'une application

Assistance à distance sous Windows

But de cette présentation

ContactForm et ContactFormLight - Gestionnaires de formulaire pour Prestashop Edité par ARETMIC S.A.

DOSSIER D'ACTIVITES SUR LE PHP N 03 Créer une base de données MySQL avec PHPMyAdmin

TABLEAU CROISE DYNAMIQUE

Exposer ses photos sur Internet

Manuel utilisateur. des. listes de diffusion. Sympa. l'université Lille 3

Table des matières. Chapitre 1 - Outils Espace de stockage Rafraichir Déposer un document Créer un dossier 5

Comment faire pour créer ses propres pages html?

Créer un publipostage avec Word 2007.

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

KeePass - Mise en œuvre et utilisation

ipra*cool v 1.08 guide de l utilisateur ipra*cool v.1-08 Guide de l'utilisateur ipra*cool v

v7.1 SP2 Guide des Nouveautés

Travail collaboratif à distance

1. Qu'est-ce que SQL? La maintenance des bases de données Les manipulations des bases de données... 5

Mémo d'utilisation de BD Dico1.6

Créer le schéma relationnel d une base de données ACCESS

Table des matières. 1 À propos de ce manuel Icônes utilisées dans ce manuel Public visé Commentaires...

CRÉER UNE BASE DE DONNÉES AVEC OPEN OFFICE BASE

Création de Sous-Formulaires

Importation des données dans Open Office Base

Gestion des documents avec ALFRESCO

Les messages d erreur d'applidis Client

SOMMAIRE 1 INTRODUCTION 4 2 GUIDE D UTILISATION ET TUTORIAUX VIDEOS EN LIGNE 4 3 CONTACTER VOTRE SUPPORT 4 4 RACCOURCIS CLAVIER 5

Volet de visualisation

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

PARAMETRER LA MESSAGERIE SOUS THUNDERBIRD

Intégrer des notices de MoCCAM-en-ligne dans BCDI abonnement

Gestion de parc informatique - Prise en main

MODE D'EMPLOI DU CONTRIBUTEUR WEB UAPV "CONTRIBUER DANS UNE RUBRIQUE DU SITE WEB"

1. Installation du Module

Utilisation du plugin AppliDis SLB (Smart Load Balancing)

Installation et utilisation du client FirstClass 11

Utilisation de l . Sommaire

Compte-rendu de projet de Système de gestion de base de données

GESTION DES BONS DE COMMANDE

Sophos Mobile Encryption pour Android Aide. Version du produit : 1.0

Business Sharepoint Contenu

Guide utilisateur Archivage intermédiaire Messagerie. Enterprise Connect pour Outlook 2010 EC V 1.0

TRUCS & ASTUCES SYSTEME. 1-Raccourcis Programme sur le Bureau (7)

Avec PICASA. Partager ses photos. Avant de commencer. Picasa sur son ordinateur. Premier démarrage

Gestion du parc informatique des collèges du département du Cher. Manuel d utilisation de la solution de gestion de Parc

Sélection du contrôleur

Publipostage avec Calc

PRODIGE V3. Manuel utilisateurs. Consultation des métadonnées

Guide d'utilisation du Serveur USB

La base de données XML exist. A. Belaïd

Utilisation du client de messagerie Thunderbird

Guide de configuration de SQL Server pour BusinessObjects Planning

1. Création d'un état Création d'un état Instantané Colonnes Création d'un état Instantané Tableau... 4

Java DataBaseConnectivity

Guide d utilisation. Table des matières. Mutualisé : guide utilisation FileZilla

FORMATION PcVue. Mise en œuvre de WEBVUE. Journées de formation au logiciel de supervision PcVue 8.1. Lieu : Lycée Pablo Neruda Saint Martin d hères

claroline classroom online

SOMMAIRE... 1 ESPACE DU CLUB...

Comptabilité - USR. Logiciel : Comptabilité USR - Version 2,16 Documentation réalisée par JJ Gorge Trésorier Tir à l'arc le 04/04/ / 15

Comment créer vos propres pages web?

Transcription:

L'application WinForm et le composant d'accès aux données Vous disposez d'un squelette de l'application AntoineVersion0- ainsi que de la base de données à restaurer dans SqlServer Bd_Antoine.dat-. Travail à faire Télécharger les deux fichiers, restaurer la base Bd_Antoine, ouvrir la solution avec VisualStudio. Dans le formulaire FrmDebut, écrire le code qui permet d'enchaîner les différents formulaires. 1.-Cas d'utilisation : gestion du personnel de service Le formulaire à construire doit permettre de gérer toutes les opérations concernant les serveurs : Formulaire de gestion des serveurs Travail à faire Ajouter les composants nécessaires sans faire figurer (pour l'instant) le composant de navigation. Le composant qui permet d'afficher les dates d'ambauche est un DateTimePicker. Le code d'accès à la base de données va être placé dans un composant spécifique une DLL- ; ceci permet de déporter dans un module spécifique une fonctionnalité qui pourra être éventuellement partagée. Cette organisation offre également de bien meilleures performances en terme de maintenance. Le formulaire ne collaborera ainsi qu'avec une structure en mémoire, un DataSet (typé) et bénéficiera néanmoins du mécanisme de liaison de données (DataBinding) ; et ceci sans avoir à connaître l'origine du DataSet.

1.a Création de la DLL d'accès aux données. Travail à faire Dans l'explorateur de solution, faire un click droit sur la Solution et choisir "Ajouter un projet" ; choisissez ensuite un projet "Bibliothèque de classes" (Visual C#) : Ajout d'un nouveau projet de type "Bibliothèque de classes" Nommez-le "LibDB", et faire "OK". Un deuxième projet apparaît dans la solution (explorateur de solutions). Supprimer la classe "Class1" générée automatiquement. Nous obtenons la configuration suivante :

Structure de la solution A partir d'un click droit sur le projet "LibDB", ajouter un nouvel élément de type "Classe Component" : Ajout d'un composant au projet "LibDB" Nommez le composant "FacadeRestaurant" (la classe se chargera de l'accès aux données pour l'application de type WinForm). Remarque : - Si l'on ouvre l'explorateur Windows, on peut visualiser l'organisation des répertoires :

Organisation des répertoires - Si l'on génère la solution (compilation à partir du menu Générer/Générer la solution), on peut voir dans l'explorateur Windows la DLL LibDB.dll (LibDB/debug/bin). La classe FacadeRestaurant de type composant permet d'utiliser le mode conception et dispose de la boite à outil des WinForm ; ce qui sera bien pratique pour générer un DataSet liée à la base de données! Travail à faire. En mode conception, ajouter une source donnée (qui va pointer sur la base de données Bd_Antoine de SQL Server) ; configurez-le en utilisant l'assistant : Données/Ajouter une source de données. Préciser la source de données (SQL Server), le Serveur et le nom de la base :

Choisir les objets de la base (tables et procédures stockées), nommer le DataSet (DSRestaurant) :

Remarque : la base contient des procédures stockées que nous allons utiliser ; c'est pourquoi nous demandons à Visual Studio de générer un objet qui nous aidera dans l'appel de ces procédures. Terminer la configuration de la source de données. En observant l'explorateur de solution, on peut observer la présence dans la solution du DataSet DSRestaurant : Nous allons lier ce DataSet (typé) à la classe FacadeRestaurant. Revenir sur la classe FacadeRestaurant en mode Design ; ajouter un DataSet (à partir de la boite à outils) :

Nommer le DataSet typé dsrestaurant Ajouter un composant de typa TableAdapter, nommez-le adapterserveur : L'adapter aura la responsabilité de charger le DataSet à partir de la base et assurera les mises à jours de la base à partir du dataset. Ecrire les deux méthodes publiques qui vont permettre de charger le DataSet (méthode fill), mettre à jour la base de données (méthode update) : public void chargelisteserveur(dsrestaurant dsrestaurant) public void sauvelisteserveurs(dsrestaurant dsrestaurant) La gestion de l'identifiant de la table serveur est assurée par SqlServer ; il est en effet possible de demander la génération d'identifiants aléatoires. Une procédure stockée dans Sql Server, appelée nouvelid, prend en charge cette génération et retourne (en argument) l'identifiant : Pour appeler cette procédure stockée, il faut procéder ainsi : - Déposer un TableAdapter dans le formulaire ; celui dont la classe a été générée par l'environnement (QueriesTableAdapter) ; nommez-le AdapterProcStock - Appeler la procédure stockée, par l'intermédiaire de cet objet, dans une méthode spécifique que l'on vous fournit :

public object getnouveauid() Guid? id = null; AdapterProcStock.nouvelID(ref id); return id; Travail à faire. Copiez cette méthode dans la classe FacadeRestaurant. Après avoir ajouté les deux clauses using : using System.Data; using System.Data.SqlClient; Générez le projet afin de vérifier l'absence d'erreur. 1.b Réalisation de l'interface de gestion du serveur : FrmServeur Travail à faire. Ouvrir le formulaire de gestion des serveurs, aller dans l'explorateur de solution et ajouter dans le projet WinForm une référence à la DLL (LibDB) : Faire Sélectionner/OK ; on voit apparaître la nouvelle référence dans le projet WinForm : Déposer dans le formulaire "FrmServeur" un DataSet typé (référencé)

Modifier le nom du DataSet : Ajout d'un DataSet typé référencé dsrestaurant de type DSRestaurant Travail à faire Ajouter une clause using : using LibDB Ajouter un attribut privé de la classe FacadeRestaurant ; dans le constructeur, générer une instance. Appeler sur cette instance la méthode de chargement du DataSet. Il est maintenant possible réaliser le DataBinding liant le DataSet aux composants graphiques. ceci va se réaliser en trois étapes : - Etape 1. Configuration du Binding Ajouter dans le formulaire le composant qui va réaliser la liaison de données entre le formulaire et le DataSet (dsrestaurant). Configurez-le comme indiqué :

- Etape 2. Configuration de la navigation. Ajouter dans le formulaire le composant qui va permettre de naviguer dans le DataSet. Configurez-le comme indiqué : - Etape 3. Liaison avec les composant graphiques. Lier chaque composant graphique à un champ de la BindingSource. Par exemple pour la zone de texte txtnom :

Liaison du champ nom du BindingSource à la propriété Text du composant graphique Ajouter le code nécessaire concernant les deux boutons de confirmation et d'annulation des mises à jour (utiliser les méthodes de la classe FacadeRestaurant) Tester l'application sur deux points toujours délicats : l'ajout d'un nouveau serveur et la suppression d'un serveur qui a des liens avec une autre table. Dans ces deux cas l'application actuelle n'est pas satisfaisante. Gestion de l'ajout d'un nouveau serveur. Le problème provient de l'identifiant qui n'est pas présent dans le formulaire ; ainsi lorsque l'on ajoute un nouveau serveur, la table Serveur du DataSet tente d'ajouter une ligne avec un identifiant null!! Pour résoudre ce problème, on va intervenir au moment de la demande d'ajout en demandant à la classe FacadeRestaurant de nous fournir cet identifiant. Double-clicker sur l'icone + du BindingNavigator afin de faire apparaître le code (vide actuellement) de son gestionnaire d'événement. Copier le code suivant : private void bindingnavigatoraddnewitem_click(object sender, EventArgs e) DataRow ligne = ((DataRowView)bdgServeur.Current).Row; ligne[0] = fc.getnouveauid(); Gestion de la suppression d'un serveur lié à une autre table. La stratégie sera différente ici, nous allons utiliser un gestionnaire d'erreur (try/catch) Travail à faire Mettre en oeuvre le gestionnaire d'erreur Gestion de l'anulation des modifications : bouton Annuler Utiliser la méthode RejectChanges. 2.-Cas d'utilisation : gestion des plats

Deux formulaires seront utilisés, l'un pour afficher la liste des plats par famille, et l'autre pour créer un nouveau plat. 2.a Liste des plats. la sélection de la famille fait apparaître les plats de cette famille. Le formulaire attendu est le suivant : Travail à faire. Ajouter au formulaire les composants nécessaires : une combolist et un datagridview La zone de liste contiendra toutes les familles et le DataGridView les plats associés. Comme pour le premier cas d'utilisation, nous allons d'abord enrichir la DLL d'accès aux données par des méthodes de chargement des familles et des plats pour un type de famille. 2.a.1 Ajout de méthodes dans la classe FacadeRestaurant. Le formulaire souhaité fait appel à une relation entre deux tables liées par une clé étrangère ; il faut vérifier que cette relation est bien présente dans le DataSet. Pour cela ouvrir le fichier DSRestaurant.xsd (à partir de l'exploratuer de solution) : Si ce n'est pas le cas, mettre en place cette relation en joignant (cliquer/glisser) les champs à lier :

Travail à faire. Dans le composant d'accès aux données, ajouter en mode conception deux adapters : Ecrire les 2 méthodes qui chargent le DataSet: public void chargelisteplats(dsrestaurant dsrestaurant) public void chargelistefamilles(dsrestaurant dsrestaurant) Générer le projet afin de vérifier qu'il n'y a pas d'erreur de syntaxe. 2.a.2 Mise en oeuvre dans le formulaire Ajouter un DataSet et un composant de binding dans l'interface :

Liaison de la comboxbox des familles Ajout des composants DataSet et BindingSouce Configurer le bindingsource afin qu'il pointe sur la table Famille : Pour configurer le DataGridView, configurer afin que la souce de donnée pointe sur la table Plat liée à la table Famille :

Par défaut, le datagridview fait apparaître toutes les colonnes de la table Plat, pour ne faire apparaître que certaine colonnes, procérer ainsi :

Sélectionner les deux colonnes désignation et prix : Selection des colonnes du datagridview Travail à faire. Dans le constructeur du formulaire écrire le code qui permet de charger le DataSet avec les tables Plat et Famille. Pour empécher les modificatins du DataGridView, mettre la propriété Enabled à false. Tester l'ensemble. 1.b-2 Ajout d'un nouveau plat Nous désirons obtenir la formulaire suivant : Création d'un plat Le ComboBox est lié à la table famille, les deux zones de texte (désignation et prix) sont indépendants des données.

Travail à faire. En s'inspirant du formulaire précédent, ajouter les composants et écrire le code qui va permettre d'afficher les différentes familles dans le ComboBox (cmbfamille); tester. Pour insérer un nouveau plat, une procédure stockée est présente dans la base Sql Server ; elle n'est pas à écrire. On vous fournit son code : Cette procédure stockée est appelée dans la DLL, grace à la méthode creenouveauplat dont on vous fournit une partie du code : public void creenouveauplat(string description, string prix, string idfamille) try // code à écrire catch (Exception ex) throw new Exception("Erreur à l'insertion"); Le bouton valider doit appeler cette méthode.

Travail à faire En vous inspirant de l'appel de la procédure stockée présentée dans le premier cas d'utilisation, compléter le code cette méthode. Appelez cette méthode dans le bouton Valider de l'interface. Tester. 3. Cas d'utilisation : gestion des tables, mise à jour des nombres de couverts par table Le formulaire attendu est le suivant : Liste des tables Remarque : la suppression d'une table a dans notre application peu de sens (des attributions pointant sur des tables inexistantes) 3.a Première version du formulaire Travail à faire. En vous inspirant de la gestion des serveurs, écrire dans la DLL et dans le formulaire le code nécessaire. Modifier une propriété du datagridview afin d'interdire toute suppression de table. 3.b Deuxième version en gérant les erreurs Si l'on teste systématique le formulaire, on est confronté à deux types d'erreur possibles : un format de donnée non conforme (données saisies non numériques) et un ajout d'un numéro de table déjà existant. Nous allons intervenir sur ces deux types d'erreur en utilisant un événement dédié aux erreurs, associé au DataGridView : private void dgvtables_dataerror(object sender, DataGridViewDataErrorEventArgs e)

Cet événement prend comme paramètre l'erreur (e) cause de l'exception. On vous fournit une partie du code de gestion de l'événement private void dgvtables_dataerror(object sender, DataGridViewDataErrorEventArgs e) if(e.exception is?) MessageBox.Show("Ce numéro de table existe déjà"); if(e.exception is? ) MessageBox.Show("le format de la donnée doit être numérique"); Travail à faire. Faire apparaître la signature du gestionnaire d'événement En regardant l'aide concernant la classe DataGridViewDataErrorEventArgs et en vous aidant de l'aide contextuelle, copier et compléter le code fourni ; tester. 4. Cas d'utilisation : gestion des tables, attribution des tables aux serveurs 4.a Sélection du serveur Sélection d'un serveur Comme pour les autres cas d'utilisation, il faudra ajouter des fonctionnalités dans la bibliothèque d'accès aux données. Par contre, si nous voulons utiliser le DataBinding sur un champ concaténé (nom+prénom) il faudra procéder un peu différemment. Création d'un TableAdapter à partir d'une nouvelle requête : Dans la DLL, à partir du schéma relationnel (fichier DSRestaurant.xsd), ajouter un Tableadapter :

Configurez-le, en remplissant les différents écrans proposés. La requête qui permet de concaténer les deux champs (nom et prénom) est la suivante : Teminer la configuration On peut voir la nouvelle table (nommez-la SERVEURPARNOMPRENOM) dans le schéma :

Dans la classe facaderestaurant, en mode design, un nouveau TableAdapter est disponible : SERVEURPARNOMPRENOMTableAdapter Déposez ce nouveau composant dans la classe en mode design : Nommez-le adapterserveurparnomprenom ; celui-ci est maintenant disponible dans le code cette classe.

Travail à faire Dans la DLL écrire la méthode qui permet de charger la table SEVEURPARNOMPRENOM à l'aide du TableAdapter correspondant. Dans l'interface ajouter les composants nécessaires et écrire le code qui va charger le ComboBox contenant les nom et prénom des serveurs. 4.b Attribution des tables au serveur sélectionné L'affichage des tables à attribuer se fait dans un composant de type DataGridView Si l'on coche des tables pour un serveur, elles ne seront plus disponibles pour un autre serveur : Gestion de l'attribution des tables aux serveurs Commentaires : Les tables 2, 5 et 8 n'apparaissent pas pour l'attribution du second serveur. Les tables attribuées à un serveur apparaissent en premier à l'affichage. Avant de compléter ce formulaire (voir 4.c), nous allons mettre en place des données à utiliser Pour obtenir les listes des tables attribuées à un serveur (le jour courant) et les listes non attribuées (le jour courant) ; nous utiliserons deux TableAdapter que nous allons configurer à partir de l'environnement prévu pour cela : le schéma DSRestaurant.xsd. Le premier TableAdapter récupèrera les tables déjà attribuées à un serveur (le jour courant) et contiendra en plus un champ booléen à vrai. Le second récupèrera toutes les tables non attribuées, ainsi qu'un champ booléen à faux. Pour que ces informations puissent être liées dans l'interface, il faudra fusionner les deux

tables. Mais attention car pour fusionner deux tables il faut qu'elles aient la même structures (les mêmes champs construits à partir des instructions SELECT). Dans notre cas, la structure commune des deux tables sera : TABLE_SERVICE.id, TABLE_SERVICE.nbPlaces, attribuee (champ ajouté de type booléen) 4.b.1 Liste des tables attribuées à un serveur le jour courant Déposer un TableAdapter et configurer-le de manière à obtenir : Remarque : la requête SQL doit sélectionner les id et nbplaces des tables attribuées à un serveur dont l'identifiant est passé en paramètre de la requête ; on vous fournit une partie de cette requête : SELECT id, nbplaces FROM TABLE_SERVICE... where a.idserveur = @idserv and a.datejour = convert(varchar,getdate(),103) ) order by a.idtableservice Pour insérer le champ attribuee, faire clic droit sur la table et indiquer ajouter/colonne ; préciser le nom et le type (booléen) Travail à faire. Configurer le TableAdapter en conséquence : requête, nom du TableAdapter. 4.b.2 Liste des tables non attribuées le jour courant Il faut faire de même pour les tables non attribuées. Remarque : la requête SQL doit sélectionner les tables de la relation Table_service qui ne se trouvent pas dans la relation Attribution le jour courant Travail à faire. Configurer le TableAdapter en conséquence : requête, nom du TableAdapter.

Il faut ensuite écrire la méthode qui va charger le DataSet avec ces deux tables ; déposer deux objets de type adapter : On vous fournit une partie de cette méthode : public void chargelisteattributiontablesserveur(dsrestaurant dsrestaurant, String idserveur) try Guid GuidServeur = new Guid(idServeur); dsrestaurant.attributiontables.attribueecolumn.defaultvalue = "true"; adapterattributiontables.fill(dsrestaurant.attributiontables,? ); dsrestaurant.tablesnonattribuees.attribueecolumn.defaultvalue =?; adaptertablesnonattribuees.fill(dsrestaurant.tablesnonattribuees);? // cette instruction permet de fusionner les deux tables catch (Exception ex) throw new Exception("Erreur au chargement"); Travail à faire Compléter la méthode en remplaçant les points d'interrogation. Compiler afin de vérifier la syntaxe 4.c Construction de l'interface d'attribution des tables Vous allez compléter le formulaire d'attribution en ajoutant les différents composants. Ajouter un DataGridView pour obtenir (en conception) :

Remarque : vous pouvez configurer plus finement le DataGridView (nom des colonnes ici) en faisant un clic droit sur le composant/modifier les colonnes : Travail à faire. Terminer la configuration du DataGridView (ajout d'un composant de Binding, liaisons) Dans l'événement clic du boutons Afficher, écrire l'appel de la méthode chargelisteattributiontablesserveur qui charge le DataSet. Tester 4.d Enregistrement des attributions.

Il faut écrire dans la DLL une méthode qui enregistre les attributions en cours pour un serveur On vous fournit une partie du code : public void sauvelisteattributions(dsrestaurant dsrestaurant,string idserv) string aujourdhui = DateTime.Now.Date.ToString(); string reqd = "delete from attribution where? "; // suppression de toutes les attributions try // du serveur pour ce jour SqlConnection maconnexion = adapterattribution.connection; maconnexion.open(); SqlCommand cmdd = new SqlCommand(reqD, maconnexion); cmdd.executenonquery(); foreach (DataRow dr in dsrestaurant.attributiontables) if(? ) // Si le champ attribuee est à vrai string reqi = "insert into attribution values (? );"; // Insertion des nouvelles attributions SqlCommand cmdi = new SqlCommand(reqI, maconnexion); cmdi.executenonquery(); catch (Exception ex) throw new Exception("Erreur lors de l'attribution"); finally adapterattribution.connection.close(); Travail à faire. Compléter le code de la méthode. Tester. 5. Cas d'utilisation : visualisation des notes. Le formulaire attendu est le suivant :

Visualisation des détails d'une note d'un serveur à une date donnée Travail à faire Dans le module d'accès aux données écrire les deux méthodes : public void chargelistenotes(dsrestaurant dsrestaurant,string idserveur, string datejour) public void chargedetailsnote(dsrestaurant dsrestaurant,string idserveur, string datejour,string idnote) Dans la Winform, le ComboBox des nom et prénom des serveurs est chargé comme pour les formulaires précédents Ecrire le code des gestionnaires des événements click.