[ Retour Accueil ]
Les accès aux données
Durée de réalisation estimée : 21H00
Objectifs
- Connaître le modèle objet ADO .NET
- Utiliser le concepteur de DataSet et les sources de données
- Créer une interface liée aux données dans une application Windows
- Manipuler les objets Connection, Command et DataReader par programmation
- Manipuler les objets du DataSet (tables, vues, relations, etc.) par programmation
- Créer et exploiter des DataSet typés et les objets TableAdapter
- Travailler avec SQL Server
- Créer et imprimer des états Crystal Report
Public et pré-requis
ce module s'adresse aux développeurs qui connaissent la programmation du Framework 2 avec le langage VB ou C# (module FRM-VB, FRM-CS ou niveau équivalent).
Sommaire
Ce module se compose de 4 chapitres :
- Les ADO .NET : un premier aperçu
- Interfaces WinForms liées aux données
- Les objets (API) ADO .NET
- Le DataSet à la loupe
[ Commander (modules C#) ] [ Commander (modules VB) ]
Que ce soit pour un développement Windows, pour une application web ou dans un projet à destination d'appareils mobiles de type Pocket PC, vous aurez rapidement besoin d'accéder à des données externes dans vos applications. Ces données résideront généralement dans une base de données, mais elles peuvent également provenir d'un fichier XML ou d'objets métier spécifiques. À cet effet, le Framework offre – sous la dénomination ADO .NET – toute une hiérarchie d'objets, située dans l'espace de noms System.Data.
ADO .NET arrive à maturité avec la version 2.0 du Framework. Les objets fondamentaux comme DataSet et DataTable qui existaient déjà dans les versions antérieures ont finalement peu évolué en apparence, mais ils ont été améliorés avec le recul donné par la version 1.x. Ainsi, le DataSet gagne en performance par une nouvelle gestion des index et par la possibilité d'une sérialisation binaire plutôt que XML, ce qui réduit les volumes de données à faire transiter dans une application n-tiers. De même, lorsque des données d’une DataTable doivent être stockées individuellement, c’est désormais possible indépendamment du DataSet, c'est-à-dire avec une taille optimisée.
Scénario du chapitre
Un bref historique vous permettra tout d'abord de mieux cerner les objectifs de la philosophie ADO .NET, nouvelle par rapport aux "ADO classiques". Viendront ensuite quelques rappels sur les notions inhérentes aux bases de données. Si ces notions vous sont familières, vous pouvez naturellement vous rendre directement à la section consacrée aux principes de base de ADO .NET, afin de faire connaissance avec les premiers concepts importants.
Avant de traiter les aspects programmation, il nous semblait important d'illustrer les gains de productivité apportés par cette nouvelle version de Visual Studio dans la construction d'une interface "orientée données". D'autant que l'environnement de développement favorise la découverte graphique des objets ADO .NET, à l’aide d’assistants, sans avoir à écrire de code. Malgré la simplicité offerte par cette approche, qui peut s’avérer suffisante dans des petites applications ou des maquettes, il faut néanmoins garder à l’esprit qu’il est indispensable de savoir comment contrôler les opérations avec du code pour développer des applications plus conséquentes, généralement architecturées en couches organisées autour d’objets métiers. Un objet métier est simplement une vue logique d’une entité spécifique associée au domaine de l’application, comme un client, un produit ou une commande dans une application commerciale.
Ce chapitre doit donc être considéré comme un premier tour d’horizon des objets ADO, alors que les deux chapitres suivants nous permettrons d’entrer dans les détails.
Points abordés
- Pourquoi ADO .NET ?
- Rappels sur les bases de données.
- Choisir un moteur de bases de données.
- La fenêtre Explorateur de serveurs.
- Principes généraux de ADO .NET.
- Choisir un fournisseur managé.
- Les sources de données (Data Sources).
- Le concepteur de DataSet.
De nouveaux composants graphiques viennent s'interfacer au DataSet présenté au chapitre précédent. Ces objets améliorent la productivité du développeur de manière assez considérable.
Scénario du chapitre
En terme d’interface, bien que les contrôles (composants visuels) diffèrent dans les applications Web, nous verrons dans les chapitres consacrés aux ASP .NET, qu’ils reposent sur des mécanismes analogues. C’est notamment le cas des sources de données, qui nous permettront de construire des formulaires simples ou de type maître/détail par des opérations de Drag and Drop.
Les différents objets rencontrés, seront examinés à chaque étape, pour illustrer les mécanismes de transfert d'informations entre les composants visuels de votre application et les sources de données sous-jacentes.
Vous verrez également comment afficher, alimenter, formater et programmer une grille de données, grâce au contrôle DataGridView, composant central d'une interface graphique liée aux données, sous Windows.
Vous apprendrez, finalement, à imprimer des données sur un état comportant un graphique, à l'aide de Crystal Reports.
Points abordés
- Construire un formulaire à partir d'une source de données.
- La liaison de données (ou DataBinding) et les objets BindingContext, PropertyManager, CurrencyManager, BindingSource et BindingNavigator.
- Le contrôle DataGridView et les objets associés (DataGridViewColumn, DataGridViewCellStyle)
- Imprimer un état avec Crystal Reports.
Le chapitre précédent nous a permis de faire connaissance avec la philosophie du DataSet, c'est-à-dire du mode déconnecté et avec les facilités offertes par Visual Studio, notamment au travers des sources de données disponibles rappelons-le, dans une application de type Windows. Cependant, pour être en mesure de tirer pleinement parti des ADO, indépendamment du type d’application développé, la programmation directe des objets sous-jacents offrira souvent une meilleure maîtrise des opérations à réaliser.
De plus, en reprenant le schéma des différentes techniques d’accès à une base de données présentées dans le précédent chapitre, les deux premières branches correspondant à l’exécution directe d’une commande ou à la récupération de données avec un DataReader, sont uniquement réalisables par programmation.
L'objectif de ce chapitre est donc de présenter l’API permettant de manipuler les objets ADO .NET avec du code en se concentrant essentiellement sur ces deux branches qui couvrent de nombreux besoins. Les techniques liées à l’utilisation d’un DataSet feront l’objet du chapitre suivant.
Scénario du chapitre
Puisqu’il est incontournable (nous verrons néanmoins comment créer dynamiquement un DataSet sans connexion au chapitre suivant), nous commenceront ce chapitre par l'objet Connection, qui constitue le point de départ de tout traitement sur une base de données.
L’objet Command sera ensuite mis en œuvre pour exécuter une instruction SQL de mise à jour (de type INSERT, UPDATE ou DELETE) ou une procédure stockée acceptant des paramètres. Si vous n’êtes pas familiarisé avec le langage SQL, vous trouverez en annexe de chapitre une présentation des principales instructions à connaitre.
Puis, dans la même lignée, nous ferons connaissance avec l’objet DataReader spécialisé dans la lecture de données fournies par une instruction SQL SELECT.
Pour illustrer l‘utilisation de ces différents objets, nous continuerons d’utiliser la même base Access Voyages2010.mdb. Aussi, une section consacrée à SQL Server a été prévue ensuite, de façon à identifier les nuances de programmation par rapport à Access.
Le niveau d'interaction avec SQL Server 2005 et ses nouvelles fonctionnalités a bien sûr été amélioré. Nous terminerons ce chapitre en montrant comment travailler avec ce système de base de données.
Points abordés
- L'objet Connection.
- L'objet Command et ses méthodes ExecuteNonQuery, ExecuteScalar et ExecuteReader.
- L'objet DataReader.
- L'exécution de procédures stockées avec ou sans paramètre.
- La gestion des transactions.
Dans les ADO classiques, l'objet central se dénommait Recordset. S'il procurait une très grande souplesse pour la réalisation de la plupart des opérations, il présentait pour principal inconvénient de stocker les données dans un format propriétaire, spécifique à l'environnement Windows, ce qui le rendait inexploitable dès lors qu'il s'agissait de dialoguer avec un système Linux, par exemple.
Les objets ADO .NET font partie des innovations majeures du Framework .NET, et marquent une rupture avec les technologies antérieures : le Recordset a été abandonné au profit d'un nouvel objet DataSet – que vous avez déjà expérimenté aux précédents chapitres – chargé de stocker et de gérer les données au format standard XML. Ceci étant vu comme une réponse aux besoins d'interopérabilité croissants des applications manipulant des données structurées.
Disons-le sans détour, dès à présent : il n'y a aucune comparaison possible entre un Recordset et un DataSet ! Ce dernier est, en effet, bien plus qu'un simple jeu d'enregistrements, et c'est tout l'objectif de ce chapitre que d'en illustrer la richesse…
Scénario du chapitre
Après avoir présenté l'objet DataSet dans ses grandes lignes, nous découvrirons la classe DataTable, objet central du DataSet, mais qui peut désormais est manipulé de manière indépendante. Pour ce faire, une table sera créée puis alimentée de manière dynamique, de façon à en manipuler les colonnes (objets DataColumn) puis les lignes de données (objets DataRow) sans avoir besoin de définir une source de données.
Nous reprendrons ensuite notre base exemple pour alimenter un DataSet. Pour ce faire, nous ferons connaissance avec le DataAdapter chargé d'établir la liaison avec les données.
Une fois le DataSet rempli, nous décrirons les techniques qui permettent d'en manipuler le contenu localement, à savoir : tris et filtrage à l'aide d'un objet DataView, ainsi que les opérations d'édition de données (ajout, suppression et modification). Nous verrons également comment définir et exploiter des relations au sein d'un DataSet.
Toutes les opérations d'édition de données étant réalisées localement, l'étape suivante consiste à synchroniser les mises effectuées avec la base de données. Ceci nous amènera naturellement à présenter les différentes méthodes de résolution des éventuels conflits rencontrés si des modifications ont été réalisées entre temps sur le même jeu données, par d'autres utilisateurs.
Nous poursuivrons avec la notion de "DataSet fortement typé", qui étend la classe DataSet par diverses propriétés et méthodes. Contrairement au DataSet non typé, c'est-à-dire générique, un DataSet typé autorise la détection d'erreurs à la compilation (et non pas à l'exécution), et aussi une meilleure productivité en cours de développement.
Suite à ces différentes explications, nous reparlerons du nouvel objet TableAdapter rencontré dès le premier chapitre, dont nous pourrons mieux comprendre le fonctionnement afin d'en tirer le meilleur parti.
Nous terminerons ce chapitre par un exemple permettant d'illustrer les mariages possibles entre un DataSet et XML.
Points abordés
- Créer et alimenter dynamiquement une DataTable.
- Configurer un DataAdapter en vue d'alimenter un DataSet à partir d'une base de données.
- Trier et filtrer une table à l'aide de l'objet DataView.
- Définir des relations entre les tables d'un DataSet.
- Edition et gestion des erreurs de mises à jour locales.
- Synchroniser le DataSet avec la base de données originales, en gérant les conflits de mise à jour.
- La notion de "DataSet fortement typé" et de schéma XSD.
- Analyse du code associé au TableAdapter.
- Alimenter un DataSet à l'aide d'un fichier XML.