Your SlideShare is downloading. ×
Bases dedonnees.net
Bases dedonnees.net
Bases dedonnees.net
Bases dedonnees.net
Bases dedonnees.net
Bases dedonnees.net
Bases dedonnees.net
Bases dedonnees.net
Bases dedonnees.net
Bases dedonnees.net
Bases dedonnees.net
Bases dedonnees.net
Bases dedonnees.net
Bases dedonnees.net
Bases dedonnees.net
Bases dedonnees.net
Bases dedonnees.net
Bases dedonnees.net
Bases dedonnees.net
Bases dedonnees.net
Bases dedonnees.net
Bases dedonnees.net
Bases dedonnees.net
Bases dedonnees.net
Bases dedonnees.net
Bases dedonnees.net
Bases dedonnees.net
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Bases dedonnees.net

1,142

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,142
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
33
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Bases de données .NET en C# (éléments de base)(document basé sur le Framework .NET 1.1 et Visual Studio 2003)Dautres documents et exemples concernant la programmation, sur les sites:www.unvrai.com, jca.developpez.com et www.developpez.comIntroductionLe but de ce document est doffrir une base de départ permettant daborder plus facilement la gestiondes bases de données telle quelle est implémentée dans lenvironnement .NET. Ce document nest, deloin, pas exhaustif et ne constitue pas un cours. Il est à voir plutôt comme un guide pour débutant, sansautre prétention que de dillustrer lutilisation de quelques techniques liées à la gestion des bases dedonnées aux travers dexemples simples. Le contenu est volontairement simplifié et lobjectif devrait êtrede présenter diverses situations traitées en ADO.NET. Pour mieux fixer les idées, disons que cessituations sont censées couvrir ce que lon peut trouver dans une application autonome et typique enAccess. Toutefois SQL Server sera également abordé.Afin de permettre à tout un chacun de réutiliser les exemples, ceux-ci utilisent la base de donnéesCOMPTOIR.MDB fournie avec Access (en loccurrence Access 2003).Parmi tous les ouvrages qui abordent le sujet des bases de données dans lenvironnement .NET, celuide Gérard Leblanc "C# et .NET", dont les bases de données ne représentent quune petite partie desdomaines abordés, est lun de ceux exposent le mieux le sujet. Ce livre a lavantage dêtre très clair auniveau technique, mais aussi pédagogique.BanalitésLes bases de données constituent un des domaines les plus anciens de linformatique et,paradoxalement, il est lun de ceux qui change le moins; notamment en ce qui concerne les bases dedonnées relationnelles, dont les concepts de base nont pas fondamentalement subi de modificationdepuis des décennies. Cependant les technologies qui entourent les bases de données (formats,modes daccès…), elles, évoluent constamment, à tel point quon peut sy perdre.ADO.NET est une évolution logique de diverses techniques daccès aux données, notamment ADO, surlesquelles nous nallons pas revenir. On assiste depuis quelques années au passage dapplicationslocalisées vers des applications délocalisées ou distribuées. XML prend également une importanceprépondérante dans léchange dinformation. Parallèlement la frontière entre les applicationstraditionnelles en bases de données et les applications basées sur internet (par exemple utilisantASP.NET) diminue. La tendance est donc, à relativement court terme, de ne plus distinguer lesWebForms et les WinForms.ADO.NET propose donc un modèle qui intègre les fonctionnalités de XML et de ADO. Cest-à-dire quiloffre des ensembles de classes, structures, interfaces, etc faisant partie intégrante du framework .NETet permettant un accès efficace et cohérent aux données. Les avantages apportés par ADO.NET sontessentiellement: • la montée en charge (scalability) pose moins de problèmes quauparavant. Par exemple il est vraiment aisé de dédoubler un serveur web en cas de puissance de traitement accrue. Ceci est en partie dû à la possibilité de travailler en mode déconnecté avec ADO.NET et dutiliser des caches en mémoire. • lutilisation abondante de XML, une technologie portable et standardisée permettant des échanges de données indépendants des systèmes et des plateformes. • Les facilités offertes au niveau du développement. Le framework .NET, et donc les langages supportés, ont été pensés et conçus pour intégrer la gestion des bases de données. Visual Studio intègre tout ce dont le développeur a besoin, quels que soient les types dapplications. _________________________________________________________________________________________J-C Armici -1-
  • 2. Il est à noter quADO.NET supporte toutes sortes de de type et de formats de données: • Des données non structurées • Des données structurées, mais sous une forme non hiérarchique (CSV, fichiers Excel, fichiers Exchange, fichiers Active Directory, etc) • Des données sous forme hiérarchique (XML) • Des bases de données relationnelles (SQL Server, Oracle, Access, etc)La compréhension de ADO.NET implique celle des modes connecté et déconnecté. En effet ADO.NEToffre, en plus du mode "habituel", un mode déconnecté. La connexion à une base de données estlopération par laquelle un programme se lie à une base de données, locale ou distante. Une connexionpeut être ouverte (pendant que le programme accède aux données) ou fermée. Nous allons décrireséparément les modes connecté et déconnecté. Le choix dun mode de travail pour une applicationparticulière nest pas toujours évident, chaque mode ayant des avantages et des inconvénients. Biencomprendre leurs différences devrait faciliter ce choix.Mode connectéDans le mode connecté, une application ouvre une connexion avec une base de données et resteconnectée pendant le traitement des données. Il sagit du mode le plus répandu et habituel. Dans cemode, une application (client) "interagit" avec la base de données (serveur), demande des données, lesmodifie et les met à jour au fur et à mesure , avance enregistrement par enregistrement dans une table,etc. Il y a un lien fort, au sens interactivité du terme, entre le client et le serveur.Mode déconnectéDans le mode déconnecté, une application se connecte à une base de données, rapatrie une partie desdonnées et se déconnecte de la base de données. Sil sagit dune opération de lecture seule (commepar exemple lors dune consultation sur un site internet) lopération est terminée. Si toutefois lapplicationdoit effectuer des adjonctions ou mises à jour de données, elle doit se reconnecter à la base pour cela.La notion importante à saisir ici est quune partie des données est amenée en mémoire locale du clientpour y être utilisée. Cette partie des données peut être vue comme un sous-ensemble de la base dedonnées. Il peut sagir dune ou plusieurs tables ou fragments de tables, avec ou sans relations. Plusgénéralement ce qui peut être exprimé à laide dune ou plusieurs instructions SELECT (en SQL). Cemode est particulièrement bien adapté à des applications internet dans lesquelles, par essence, on nepeut pas imposer une connexion continue à un client. Un utilisateur peut quitter un site ou fermer sonbrowser de manière impromptue; cest dailleurs le mode de fonctionnement habituel.Avantages, inconvénients et choix du mode de travailNous nallons pas donner ici des recettes permettant de décider quel mode est le plus adapté à quelapplication. Léventail et la diversité des applications rendent les choses plus subtiles. Et dailleurs il estcertainement possible de concevoir une même application aussi bien en mode connecté quen modedéconnecté.Un principe se dégage toutefois: pour un site internet le mode déconnecté paraît vraiment, dans leplupart de cas, le plus adéquat.Attachons-nous maintenant à décrire le principaux avantages et inconvénients des deux modes detravail _________________________________________________________________________________________J-C Armici -2-
  • 3. Avantages Mode connecté Mode déconnecté Accès concurrent plus facile à contrôler Bien adapté aux utilisateurs mobiles Données plus pertinentes (globalement Augmentation des performance et facilité plus souvent à jour) de montée en charge Utile dans les cas de consultation de donnéesInconvénients Mode connecté Mode déconnecté Nombre daccès à la base de données et Les données sont moins souvent à jour trafic réseau plus élevés Nécessité de résoudre les conflits lors des mises à jour Demande de la place mémoire côté client et plus de subtilité afin doptimiser la quantité dinformation rapatriée sur le clientAfin de faciliter la compréhension des modes connecté et déconnecté, nous allons simplifier la situationde la manière suivante: ADO.NET Data Provider Connection Command DataAdapter Data base DataReader DataSet Client (WinForm, WebForm…) Fig. 1 Modèle ADO.NET simplifié _________________________________________________________________________________________J-C Armici -3-
  • 4. Le mode connecté utilise généralement: • Un objet Connection • Un objet Command • Un objet DataReaderAlors que le mode déconnecté fait appel à: • Un objet Connection • Un objet DataAdapter • Un objet DataSetVoyons plus précisément ce que recouvrent ces divers objets. Tout dabord, la notion de fournisseur dedonnées (data provider) recouvre un ensemble de classes spécifiques à une source de données etfonctionne uniquement avec cette source de données. Son fonctionnement est analogue à celui dunpilote (driver) et permet deffectuer les opérations de base: connexion à la source de données, lecturedes données, mise à jour, etc. Pour le moment il existe quelques fournisseurs de données inclus dansle framework .NET, mais à terme on trouvera des fournisseurs de données pour la plupart des SGBD.La figure 2 montre les 4 fournisseurs actuellement pris en charge sous forme de composants (et declasses): • xxxDataAdapter • xxxConnection • xxxCommandOù xxx concerne: • OleDb, par exemple pour accéder aux bases de données Access ou SQL Server (antérieures à la version 7.0) • Sql, pour les versions récentes de SQL Server • Odbc, pour la plupart des SGBD pour lesquels un pilote ODBC existe. Cette possibilité élargit léventail des SGBD supportés • Oracle, pour lincontournable SGBD bien connu Fig. 2 Les SGBD pris en charge dans Visual Studio 2003 _________________________________________________________________________________________J-C Armici -4-
  • 5. Comme on peut le voir sur le schéma de la figure 1, alors que les objets DataAdapter, Connection,Command et DataReader sont dépendants du fournisseur de données. Alors que la classe DataSetest indépendante du SGBD, donc de la source de données, et ses fonctionnalités sont accessiblesquelle que soit lorigine des données dans une application.Connexion à une base de donnéesLors de la connexion à une base de données on doit fournir une chaîne de connexion, qui nest autrequune chaîne de caractère contenant des paramètres propres à chaque fournisseur de données. Onpeut y trouver notamment le nom du fournisseur de données, le chemin de la base de données, le nomdutilisateur et le mot de passe, et bien dautres paramètres. Voici un exemple permettant la connexion àune base de données Access: string stConn = @"Data Source=""E:.NETJCADBcomptoir.mdb""; Provider=""Microsoft.Jet.OLEDB.4.0""; User ID=Admin"; OleDbConnection Connection = new OleDbConnection(stConn); // connexion OleDbBien entendu dans une application réelle le chemin de la base de données ne devrait pas figurer demanière absolue dans la chaîne de connexion, mais plutôt comme paramètre permettant daccéder à labase de données sans devoir recompiler lapplication si le chemin daccès change. Signalons égalementque dans le cas ODBC le DSN (Data Source Name) constitue déjà une indirection et les paramètres deconnexion sont définis au niveau du système dexploitation. De ce fait la chaîne de connexion peut serésumer à: string stConn = "dsn=MaBase"; OdbcConnection Connection = new OdbcConnection(stConn); // connexion OdbcConnectionComme on peut le voir sur les fragments code précédents, la connexion à la base de données estgénéralement créée en spécifiant la chaîne de connexion. Dès ce moment la connexion peut êtreouverte, utilisée, puis fermée.CommandLobjet Command permet dinteragir avec la base de données au travers de commandes fournies enSQL. Comme nous le verrons au travers dexemples, il existe plusieurs variantes pour lutilisation descommandes SQL. Voici un exemple montrant utiliser une commande SQL, ici dans le mode déconnectéavec un DataAdapter: string stConn = @"Data Source=""E:.NETJCADBcomptoir.mdb""; Provider=""Microsoft.Jet.OLEDB.4.0""; User ID=Admin"; String stCmd = "SELECT Contact FROM Clients"; OleDbConnection Connection = new OleDbConnection(stConn); // connexion OleDb Connection.Open(); OleDbDataAdapter DA = new OleDbDataAdapter(stCmd, Connection);DataReaderLobjet DataReader, utilisé en mode connecté, permet daccéder aux données dune base de donnéesrécupérées par lintermédiaire dune commande SQL. Voici une illustration de lutilisation dunDataReader (en mode connecté) _________________________________________________________________________________________J-C Armici -5-
  • 6. string stConn = @"Data Source=""E:.NETJCADBcomptoir.mdb""; Provider=""Microsoft.Jet.OLEDB.4.0""; User ID=Admin"; string stCmd = "SELECT Contact FROM Clients"; OleDbCommand Cmd; OleDbConnection Connection = new OleDbConnection(stConn); // connexion OleDb Connection.Open(); Cmd = new OleDbCommand (stCmd,Connection); // commande pour cette connexion OleDbDataReader DR = Cmd.ExecuteReader(); if (DR != null) { while (DR.Read()) // boucle de lecture { listBox1.Items.Add (DR["Contact"]); // ajout dans le listBox } } Connection.Close();Le mode connecté, avec un DataReader, permet un accès séquentiel, à sens unique (du début vers lafin) et en lecture seule. Ceci peut paraître restrictif, mais il est bien entendu possible de faire appel auxcommandes SQL INSERT, UPDATE ou DELETE pour le traitement des données.DataAdapterUn DataAdapter établit le lien entre une source de données et un DataSet. Il est donc utilisé pourremplir un DataSet ainsi que pour effectuer la mise à jour des données dans la base de données.DataSetLa classe DataSet est le composant central du mode déconnecté dADO.NET. Comme nous lavons ditprécédemment, un DataSet correspond à une portion de la base de données, une sorte de cache enmémoire incluant les données, les relations, les contraintes, etc. Nous en verrons lutilisation dansdivers exemples. _________________________________________________________________________________________J-C Armici -6-
  • 7. Le mode déconnectéDans cette partie nous allons voir plusieurs exemples utilisant le mode déconnecté.Exemple 1:Dans cet exemple le programme accède à la table Clients de la base de données AccessCOMPTOIR.MDB en mode déconnecté. Nous devons ajouter laccès aux namespaces System.Data etSystem.Data.OleDb: using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Data.OleDb; Fig. 3 Remplissage dun listBoxNous voulons simplement remplir le listBox avec la liste des noms de clients (champ Contact) de latable Clients. Pour cela nous faisons appel à un bouton dont voici le code associé: private void buttonConnection_Click(object sender, System.EventArgs e) { string stConn = @"Data Source=""E:.NETJCADBcomptoir.mdb""; Provider=""Microsoft.Jet.OLEDB.4.0""; User ID=Admin"; OleDbConnection Connection = new OleDbConnection(stConn); // connexion OleDb Connection.Open(); OleDbDataAdapter DA = new OleDbDataAdapter("SELECT [Contact] FROM Clients", Connection); DataSet DS = new DataSet(); DA.Fill(DS, "Clients"); // remplissage du DataSet listBox1.DataSource = DS.Tables[0]; // remplissage du listBox listBox1.DisplayMember = "Contact"; Connection.Close(); } _________________________________________________________________________________________J-C Armici -7-
  • 8. Exemple 2:Dans ce programme, en plus dun listBox contenant les noms des Clients, nous avons ajouté troistextBox associés au Code Client, à la Société et au Contact de la table Clients. Fig. 4 Remplissage dun listBox et de textBoxVoici le code correspondant au clic sur le bouton "Remplir Clients": private void buttonConnection_Click(object sender, System.EventArgs e) { string stConn = @"Data Source=""E:.NETJCADBcomptoir.mdb""; Provider=""Microsoft.Jet.OLEDB.4.0""; User ID=Admin"; string stCmd = "SELECT [Code client], [Société], [Contact] FROM Clients"; OleDbConnection Connection = new OleDbConnection(stConn); // connexion OleDb Connection.Open(); OleDbDataAdapter DA = new OleDbDataAdapter(stCmd, Connection); DataSet DS = new DataSet(); DA.Fill(DS, "Clients"); // remplissage du DataSet listBox1.DataSource = DS.Tables[0]; // remplissage du listBox listBox1.DisplayMember = "Contact"; textBoxCodeClient.DataBindings.Add("Text", DS.Tables[0], "Code client"); textBoxSociete.DataBindings.Add("Text", DS.Tables[0], "Société"); textBoxContact.DataBindings.Add("Text", DS.Tables[0], "Contact"); Connection.Close(); }DataBindings est une collection contenant les caractéristiques de la liaison du composant textBoxavec les données.Remarque: Les textBox et le listBox étant liés à la même table du même DataSet par lintermédiaire du DataAdapter DA, lorsque lon clique sur une ligne du listBox, le contenu des 3 textBox est automatiquement synchronisé par rapport à lenregistrement "pointé" par le listBox. _________________________________________________________________________________________J-C Armici -8-
  • 9. Exemple 3:Ce programme reprend lidée du programme précédent en modifiant lemplacement de certainesinstructions et en ajoutant la possibilité de naviguer parmi les enregistrements à laide de boutonsLes champs suivants ont été ajoutés dans la définition de Form1: private CurrencyManager current; private string stConn = @"Data Source=""E:.NETJCADBcomptoir.mdb""; Provider=""Microsoft.Jet.OLEDB.4.0""; User ID=Admin"; private OleDbConnection Connection;La classe CurrencyManager dérive de BindingManagerBase et permet la synchronisation descontrôles dépendants dans un WinForm qui sont liés à la même source de données. LeCurrencyManager gère un pointeur vers lélément en cour. Ceci permet non seulement de connaître laposition courante, mais également de spécifier cette position.Dans ce programme on va chercher les données directement au moment du chargement de la fenêtre(Load) private void Form1_Load(object sender, System.EventArgs e) { Connection = new OleDbConnection(stConn); // connexion OleDb Connection.Open(); string stCmd = "SELECT [Code client], [Société], [Contact] FROM Clients"; OleDbDataAdapter DA = new OleDbDataAdapter(stCmd, Connection); DataSet DS = new DataSet(); DA.Fill(DS, "Clients"); // remplissage du DataSet listBox1.DataSource = DS.Tables[0]; // remplissage du listBox listBox1.DisplayMember = "Contact"; textBoxCodeClient.DataBindings.Add("Text", DS.Tables[0], "Code client"); textBoxSociete.DataBindings.Add("Text", DS.Tables[0], "Société"); textBoxContact.DataBindings.Add("Text", DS.Tables[0], "Contact"); current = (CurrencyManager)this.BindingContext[DS.Tables[0]]; // indicateur de // position }La fermeture de la connexion est effectuée au moment de la fermeture de la fenêtre: private void Form1_Closed(object sender, System.EventArgs e) { Connection.Close(); }Les événements suivants répondent au clic sur lun des 4 boutons de déplacement: private void btnPrecedent_Click(object sender, System.EventArgs e) { current.Position--; lblCount.Text = current.Position.ToString(); } private void btnSuivant_Click(object sender, System.EventArgs e) { current.Position++; lblCount.Text = current.Position.ToString(); } private void btnPremier_Click(object sender, System.EventArgs e) { current.Position = 0; lblCount.Text = current.Position.ToString(); } _________________________________________________________________________________________J-C Armici -9-
  • 10. private void btnDernier_Click(object sender, System.EventArgs e) { current.Position = current.Count - 1; lblCount.Text = current.Position.ToString(); }A noter que lblCount est un label permettant dafficher le numéro de lenregistrement courant.Tout ceci fonctionne bien, mais lorsquune ligne est sélectionnée dans le listBox, le numéro delenregistrement courant nest pas modifié. Pour cela nous faisons appel à lévénementSelectedItemChanged du listBox afin de récupérer la position courante: private void listBox1_SelectedIndexChanged(object sender, System.EventArgs e) { current.Position = listBox1.SelectedIndex; lblCount.Text = current.Position.ToString(); } Fig. 5 Navigation dans les enregistrementsExemple 4:Ce programme remplit un DataGrid avec le contenu de la table Clients, en gardant uniquementquelques colonnes. La définition de la classe Form1 est complétée par: private string stConn = @"Data Source=""E:.NETJCADBcomptoir.mdb""; Provider=""Microsoft.Jet.OLEDB.4.0""; User ID=Admin"; private OleDbConnection Connection;Et le reste du code est constitué par: private void Form1_Load(object sender, System.EventArgs e) { Connection = new OleDbConnection(stConn); // connexion OleDb string stCmd = @"SELECT [Code client], [Société], [Contact], [Ville], [Pays], [Fax] FROM Clients"; Connection.Open(); OleDbDataAdapter DA = new OleDbDataAdapter(stCmd, Connection); DataSet DS = new DataSet(); DA.Fill(DS, "Clients"); // remplissage du DataSet dgClients.DataSource = DS; _________________________________________________________________________________________J-C Armici - 10 -
  • 11. dgClients.DataMember = "Clients"; } private void Form1_Closed(object sender, System.EventArgs e) { Connection.Close(); }La propriété DataSource du DataGrid permet de lassocier au DataSet contenant lesenregistrements demandés et la propriété DataMember permet dindiquer la table concernée.Lenvironnement Visual Studio permet une multitude de paramétrage de propriétés concernant laspectdu DataGrid; en voici le résultat: Fig. 6 Utilisation dun DataGridRemarque: Il est important de noter que le nom donné au contenu du DataSet peut être différent de celui de la table de la base de données: Au lieu de Clients nous pouvant utiliser un autre nom, par exemple Cli: string stCmd = @"SELECT [Code client], [Société], [Contact], [Ville], [Pays], [Fax] FROM Clients"; Connection.Open(); OleDbDataAdapter DA = new OleDbDataAdapter(stCmd, Connection); DataSet DS = new DataSet(); DA.Fill(DS, "Cli"); // remplissage du DataSet dgClients.DataSource = DS; dgClients.DataMember = "Cli"; De plus, si lun des enregistrements est modifié dans le DataGrid: _________________________________________________________________________________________J-C Armici - 11 -
  • 12. Fig. 7 Modification des données On peut le valider, mais cette validation sera uniquement valable dans le DataSet. Et rappelons quon est en mode déconnecté et tant quaucune opération de mise à jour nest effectuée sur la base de données, les modifications ne sont pas reportées. En dautres termes, comme le DataSet réside en mémoire, après la fin de lexécution du programme toute modification, suppression, insertion sont perdues.Exemple 5:Ce programme est une variante du précédent permettant à lutilisateur de spécifier où se trouve la basede données Comptoir.mdb. Pour cela on fait appel à un openFileDialog que lon place sur lafenêtre de lapplication. Afin dextraire le nom du fichier de openFileDialog1.FileName on fait appelà la classe FileInfo définie dans System.IO: using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Data.OleDb; using System.IO;Au niveau de Form1 on définit également les champs: private string stConn = "Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin"; private OleDbConnection Connection;Le reste devient: private void Form1_Load(object sender, System.EventArgs e) { string fName; openFileDialog1.Filter = "Fichiers Access (*.mdb)|*.mdb"; openFileDialog1.InitialDirectory = Application.StartupPath; openFileDialog1.Title = "Chemin de la base de données Comptoir.mdb"; openFileDialog1.FileName = "comptoir.mdb"; if (openFileDialog1.ShowDialog() == DialogResult.OK) { fName = new FileInfo(openFileDialog1.FileName).Name.ToUpper(); if ( fName != "COMPTOIR.MDB") // test bonne base de données return; fName = openFileDialog1.FileName; _________________________________________________________________________________________J-C Armici - 12 -
  • 13. stConn = "Data Source=" + fName + ";" + stConn; string stCmd = @"SELECT [Code client], [Société], [Contact], [Ville], [Pays], [Fax] FROM Clients"; Connection = new OleDbConnection(stConn); // connexion OleDb Connection.Open(); OleDbDataAdapter DA = new OleDbDataAdapter(stCmd, Connection); DataSet DS = new DataSet(); DA.Fill(DS, "Clients"); // remplissage du DataSet dgClients.DataSource = DS; dgClients.DataMember = "Clients"; } } private void Form1_Closed(object sender, System.EventArgs e) { if (Connection != null) Connection.Close(); }La boîte de dialogue suivante apparaît au lancement de lapplication: Fig. 8 Recherche de Comptoir.mdbExemple 6:Cet exemple montre comment utiliser un assistant de création de fenêtre liée à une base de données. Ilpermet de bien comprendre, au travers du code généré par lassistant, les mécanismes du modedéconnecté lors des opérations de mise à jour, ajout ou suppression.Voici comment procéder: • Dans un premier temps il faut créer un nouveau projet sous forme dune application Windows en C# _________________________________________________________________________________________J-C Armici - 13 -
  • 14. • Dans le menu contextuel du projet (ici Access6), choisir dajouter un nouvel élément: Fig. 9 Ajout dun nouvel élément au projet • Dans la boîte de dialogue qui apparaît, choisir "Assistant formulaire de données" Fig. 10 Lancement de lassistant • Il faut ensuite suivre les étapes: _________________________________________________________________________________________J-C Armici - 14 -
  • 15. Fig. 11 Démarrage de lassistant • Créer ensuite un nouveau groupe de données (ici DSClients) Fig. 12 Choix dun groupe de données (DataSet) • Il faut ensuite choisir une connexion de données. Si la connexion désirée na encore jamais été utilisée dans un projet en Visual Studio, il faut cliquer sur le bouton "Nouvelle connexion…" _________________________________________________________________________________________J-C Armici - 15 -
  • 16. Fig. 13 Choix dune connexion de données • Pour une nouvelle connexion il faut parcourir les différents onglets (essentiellement les deux premiers) de la fenêtre suivante: Fig. 14 Spécification dune nouvelle connexion _________________________________________________________________________________________J-C Armici - 16 -
  • 17. • Après avoir spécifié la base de données à utiliser, on se retrouve avec la fenêtre de la figure15, et en cliquant sur le bouton "Suivant" on peut choisir une ou plusieurs tables ou vues: Fig. 15 Choix du contenu du groupe de données • Après avoir cliqué sur le bouton "Suivant", on obtient: Fig. 16 Choix des champs (colonnes) à afficher _________________________________________________________________________________________J-C Armici - 17 -
  • 18. • Après avoir cliqué sur le bouton "Suivant", on peut choisir le style daffichage (ici un enregistrement à la fois) ainsi que la présence de divers boutons (Ajouter, Supprimer,…) Fig. 17 Choix du style daffichage • Finalement on obtient la fenêtre suivante, en mode conception. On remarque les trois composants ajoutés automatiquement par lassistant: Fig. 18 Résultat généré par lassistant _________________________________________________________________________________________J-C Armici - 18 -
  • 19. • Le résultat final est simple, mais fonctionnel: Fig. 19 Visualisation des donnéesRemarque: Si, à létape de la figure 15 nous avions choisi deux tables, par exemple Clients et Commandes, nous aurions eu droit à la fenêtre suivante permettant de spécifier la relation entre les tables afin que le code produit automatiquement par lassistant puisse effectuer correctement la synchronisation entre table parent et table enfant. Fig. 20 Spécification des relations _________________________________________________________________________________________J-C Armici - 19 -
  • 20. Le résultat obtenu serait alors le suivant: Fig. 21 Exemple de formulaire avec sous-formulaireVoilà donc un exemple concret montrant le mode déconnecté en fonction. Il y a fonctionnellement peude différences entre ce programme et un formulaire équivalent écrit, par exemple, en Access.Il peut être intéressant de mettre cet assistant à contribution, au moins pour bénéficier du code généré.Quant à laspect un peu austère de linterface utilisateur, le développeur aura tout loisir de le rendre plusévolué esthétiquement ou ergonomiquement. On dispose donc dune bonne base de départ pourélaborer un vrai projet, même complexe.Bases de données et XMLXML (Extensible Markup Language) est un standard ouvert de stockage dinformation, un format defichier lisible (sous forme de texte) et simple, basé sur le principe du balisage. XML prend de plus enplus dimportance, à tel point que plusieurs SGBDR, dont SQL Server, peuvent lutiliser comme formatde stockage de données. Dans le framework .NET XML est omniprésent, explicitement ouimplicitement. Dans la gestion des bases de données mettant en jeu des DataSet, XML est le supportsous-jacent de la représentation des données, ce qui permet notamment une communication aisée avecles services web dont léchange de données seffectue précisément en XML. _________________________________________________________________________________________J-C Armici - 20 -
  • 21. Létude complète de XML et des éléments qui lui sont associés ne va pas être abordée ici. Bien que sastructure soit simple et facile à comprendre, il est rare que lon doive écrire à la main du code XML;Plusieurs classes de .NET possèdent des méthodes permettant de lire et de générer facilement dedonnées au format XML. On peut donc travailler avec XML sans vraiment en maîtriser tous les aspects.Dans les exemples qui précèdent nous avons abordé le travail avec une base de données de manière"classique", en créant les divers objets, par exemple les DataSet, de façon dynamique. Nous allons voirmaintenant comment aborder les bases de données, toujours en mode déconnecté, de manière plus"moderne" par rapport aux outils de développement existants.Exemple 7:Cet exemple met en œuvre une approche légèrement différente pour travailler avec une table dunebase de données Access, utilisant notamment un DataSet typé.Après avoir créé un nouveau projet C# (application Windows), un DataGrid est placé dans la fenêtre delapplication: Fig. 22 Fenêtre principale avec un DataGridAprès avoir fait afficher longlet "Explorateur de serveurs" (Ctrl-Alt-S) on peut voir une situation analogueà celle-ci: Fig. 23 Explorateur de serveurs _________________________________________________________________________________________J-C Armici - 21 -
  • 22. En fonction de des projets précédemment créés des connexions existantes sont montrées. Si laconnexion qui nous intéresse ne figure pas dans la liste, il faut lajouter à laide dun clic droit sur"Connexions de données", puis "Ajouter une connexion…" Fig. 24 Ajout dune nouvelle connexionDans notre cas, comme la connexion à la base de données Comptoir.mdb existe, il suffit de déployerlarborescence jusquà atteindre la liste des tables de cette base de données: Fig. 25 Liste des tablesA laide du glisser-déplacer (drag and drop) on amène la table Clients sur la fenêtre de lapplication.Visual Studio crée alors les deux objets Fig. 26 Connexion et adapteurA ce stade nous allons créer un DataSet à laide dun clic droit sur le projet, dans lexplorateur de projet.Dans loption "Ajouter un nouvel élément…" nous choisissons dajouter un DataSet comme le montre lafigure 27: _________________________________________________________________________________________J-C Armici - 22 -
  • 23. Fig. 27 Ajout dun DataSetCeci crée un nouveau fichier Dataset1.xsd dans le projet. Fig. 28 Ajout dun DataSetDe plus longlet suivant est affiché et va nous permettre de spécifier le contenu du DataSet Fig. 29 Préparation à la spécification de la structure du DataSetComme lindique la note figurant dans cette fenêtre nous allons faire un glisser-déplacer de la tableClients, depuis lexplorateur de serveurs vers cette fenêtre. Voici ce qui apparaît alors: _________________________________________________________________________________________J-C Armici - 23 -
  • 24. Fig. 30 représentation graphique de la structure du DataSetEn réalité la structure du DataSet est décrite sous forme XML (voir figure 31), mais Visual Studio nousla montre également sous une forme plus visuelle. Dailleurs longlet XML au bas de cette fenêtremontre le contenu du fichier Dataset1.xsd. <?xml version="1.0" encoding="utf-8" ?> <xs:schema id="Dataset1" targetNamespace=http://tempuri.org/Dataset1.xsd elementFormDefault="qualified" attributeFormDefault="qualified" xmlns="http://tempuri.org/Dataset1.xsd" xmlns:mstns="http://tempuri.org/Dataset1.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xs:element name="Dataset1" msdata:IsDataSet="true"> <xs:complexType> <xs:choice maxOccurs="unbounded"> <xs:element name="Clients"> <xs:complexType> <xs:sequence> <xs:element name="Code_x0020_client" type="xs:string" /> <xs:element name="Société" type="xs:string" minOccurs="0" /> <xs:element name="Contact" type="xs:string" minOccurs="0" /> <xs:element name="Fonction" type="xs:string" minOccurs="0" /> <xs:element name="Adresse" type="xs:string" minOccurs="0" /> <xs:element name="Ville" type="xs:string" minOccurs="0" /> <xs:element name="Région" type="xs:string" minOccurs="0" /> <xs:element name="Code_x0020_postal" type="xs:string" minOccurs="0" /> <xs:element name="Pays" type="xs:string" minOccurs="0" /> <xs:element name="Téléphone" type="xs:string" minOccurs="0" /> <xs:element name="Fax" type="xs:string" minOccurs="0" /> </xs:sequence> </xs:complexType> </xs:element> </xs:choice> </xs:complexType> <xs:unique name="Dataset1Key1" msdata:PrimaryKey="true"> <xs:selector xpath=".//mstns:Clients" /> <xs:field xpath="mstns:Code_x0020_client" /> </xs:unique> </xs:element> </xs:schema> Fig. 31 Structure du DataSet sous forme XML _________________________________________________________________________________________J-C Armici - 24 -
  • 25. Nous allons maintenant générer le DataSet en sélectionnant oleDbDataAdapter1 (visible sur la figure26) et en cliquant sur "Générer le groupe de données…" apparaissant sous la fenêtre des propriétés: Fig. 32 Option pour générer le DataSetDans notre cas le DataSet existe, il sagit de Dataset1 et nous choisissons la table Clients. A noterquil est également possible de choisir un nouveau DataSet. Fig. 33 Choix du DataSetNous devons maintenant lier les données provenant de ce DataSet (donc de la table Clients) avec leDataGrid qui se trouver dans la fenêtre de lapplication. Pour cela il faut sélectionner le DataGrid, et luiaffecter une source de données (DataSource). Fig. 34 Choix de la source de données _________________________________________________________________________________________J-C Armici - 25 -
  • 26. En déroulant la liste concernée nous trouvons dataset11.Clients qui est précisément la source dedonnées que nous souhaitons afficher. Les entêtes de colonnes sont alors affichés dans la grille: Fig. 35 Grille associée au DataSetAfin que les données puissent être affichées, il faut encore écrire le code permettant de remplir leDataSet. Pour cela, nous plaçons un bouton sur la fenêtre, sur le clic duquel nous définissons le codeévénementiel suivant: private void btnCharger_Click(object sender, System.EventArgs e) { oleDbDataAdapter1.Fill (dataset11.Clients); }Après le lancement de lapplication, le clic sur le bouton permet dafficher les données: Fig. 36 Affichage des données _________________________________________________________________________________________J-C Armici - 26 -
  • 27. Remarque: Le contenu de ce document se rapporte à Visual Studio 2003. Larrivée du Framework .NET 2.0 et de Visual Studio 2005 (tous deux en version beta 2 actuellement) apporte une somme considérable de nouveautés et daméliorations, tant au niveau du langage quau niveau des outils de développement. Les bases de données ne sont pas en reste. Bien quen principe le nouveau cru 2005 soit compatible avec la version précédente, le mode de travail du développeur a été en partie modifié. Un nouveau document consacré aux bases de données dans lenvironnement .NET devrait donc bientôt apparaître. A suivre… _________________________________________________________________________________________J-C Armici - 27 -

×