ADO.NET Ado.net est une technologie d'accès aux données qui fournit un ensemble des classes permettant d'accéder aux données relationnelles. Ado.net propose deux modes d'accès, le mode connecté et le mode déconnecté. LE MODE CONNECTÉ Ce mode classique maintient la connexion à la base de données, il permet de créer un mécanisme de "curseur" permettant de parcourir les données ligne à ligne. Ado.net ne propose qu'un accès en lecture -en avant seulement- avec ce mode. Il est approprié pour parcourir des tables volumineuses rapidement. LE MODE DÉCONNECTÉ C'est la grande nouveauté de l'architecture .net. Après une connexion et le chargement de données, tout se passe en mémoire. Ceci libère les ressources du serveur de données, par contre le mécanisme de cohérence et d'intégrité des données est exigeant. Nous allons étudier ce dernier type d'accès. Dotnet propose un ensemble de classes. Une classe générique, DataSet, est au centre du dispositif ; c'est cette classe qui servira de conteneur en mémoire des tables et des requêtes. Nous allons partir d'un cas pour décrire les classes mises en œuvre. CRÉATION D’UN DATASET La base de données exemple est créée sous SQl server, son nom est « Etudiant ». Ceci fait nous créons un nouveau projet de nom « AccèsDonnées ». Nous ajoutons à ce projet une source de données. Pour cela on sélectionne le projet « AccèsDonnées » et puis dans les menus sur « Données », on choisit « Ajouter une source de données ». Dans l’assistant qui apparaît on sélectionne « Base de données », puis on fait suivant. Sur l’écran suivant, on choisit « Dataset », puis suivant. Sur le pop-up suivant, on clique sur le bouton « Nouvelle connexion ». Pour la source de données, on choisit MICROSOFT SQL SERVER, on sélectionne son serveur Sql Server 2008. On saisit ensuite un compte utilisateur connu de Sql Server 2008 et ayant des droits suffisants sur la base de données "Etudiant". On teste la connexion. Si tout fonctionne on fait « OK ». 1 Marie-pascale Delamare d'après Visual Basic 2010 Éditions ENI et les documentations Microsoft. Demander ensuite à inclure les données sensibles dans la chaine de connexion. Puis à enregistrer la connexion. Et enfin, sélectionner la table Etudiant de la base de données « Etudiant ». Le « dataset » est maintenant créé, il reste à le configurer en fonction des besoins de l’application. LE DATASET, LES DATATABLES ET LES TABLEADAPTERS Le concepteur affiche deux classes : une classe Etudiant (dataTable) et une classe EtudiantTableAdapter (tableAdapter). La structure d’un groupe de données (DataSet) est très proche de celle d’une base de données relationnelle dans la mesure où un Dataset est constitué d’une hiérarchie de classes représentant des tables (DataTable), des lignes (DataRow), des colonnes (DataColumn), des contraintes (Constraint) et même des relations (Relation) : 2 Marie-pascale Delamare d'après Visual Basic 2010 Éditions ENI et les documentations Microsoft. La seule chose importante à comprendre est qu’on travaille ici en mémoire, et qu’on va manipuler des objets instanciation de ces classes. C’est pourquoi il n’y aucun lien entre un DataSet et ses sources de données physiques. Le DataSet instancié est donc un objet qui réside en mémoire et qui correspond à une copie locale des données d'une base. Il contient les tables d'une base mais aussi les relations entre ces différentes tables et les contraintes appliquées aux données. Le modèle objet du DataSet a les trois collections suivantes : La collection "DataTableCollection" : Cette collection peut contenir de zéro à n objets de type DataTable. Chaque objet DataTable représente une table d'une source de données. Chaque DataTable est constituée d'une collection Columns et d'une collection Rows qui peuvent contenir respectivement de zéro à n objets DataRow et DataColumn. La collection "DataRelationCollection" : Cette collection peut contenir de zéro à n objets de type DataRelation. Un objet DataRelation défini une relation parent-enfant entre deux tables à partir des valeurs des clés étrangères. La collection "ExtendedProperties" : Cette collection correspond à un objet de type PropertyCollection qui peut contenir de zéro à n propriétés définies par un utilisateur. Cette collection peut être utilisée afin de stocker des informations personnalisées liées au DataSet utilisé (date et heure de génération des données, ordre select passé pour générer les données.). Exemple de déclaration (pour notre projet) d'un dataset et d'une dataTable : 'on declare le dataset Private dataset As EtudiantDataSet ' on declare la datatable etudiant dans le dataset Private tableEtudiant As EtudiantDataSet.EtudiantDataTable Et l'instanciation : dataset = New EtudiantDataSet tableEtudiant = New EtudiantDataSet.EtudiantDataTable 3 Marie-pascale Delamare d'après Visual Basic 2010 Éditions ENI et les documentations Microsoft. La classe TableAdapter, pour nous EtudiantTableAdapter qu'il faudra instancier, est celle qui permet de relier la source de données physique à l’objet mémoire DataSet. Le DataSet est indépendant de la source de données. Il ne la connait pas. C’est l'objet instanciation de la classe TableAdapter, qui fait tout le travail de communication avec la base, à la fois de connexion et à la fois de requêtage pour extraire ou mettre à jour les données. C’est un objet qui comprend 4 sous-objets de commande, chargés de « commander » la base, chacun dédié à un type de requête vers la base. L’objet SelectCommand gère l’extraction de données tandis que les trois autres objets s’occupent des autres types de requêtes (Insert, Update et Delete). Le DataSet n’a aucune connexion directe avec la base de données physique. Remarque : Dans le schéma ci-dessus, on parle de DataAdapter et non de TableAdapter. Simplement, retenez qu’un TableAdapter est une classet DataAdapter mais plus riche que la classe de base. Elle est générée pour nous par l’Assistant Configuration de sources de données pour nous permettre d’aller plus loin en matière d’interaction avec la base de données. Exemple de déclaration d'un tableAdapter : ' on declare le table adapter pour accéder à notre base de données table étudiant Private tableAdaptaterEtudiant As EtudiantDataSetTableAdapters.EtudiantTableAdapter Et l'instanciation : tableAdaptaterEtudiant = New EtudiantDataSetTableAdapters.EtudiantTableAdapter 4 Marie-pascale Delamare d'après Visual Basic 2010 Éditions ENI et les documentations Microsoft. La lecture de données et le remplissage d'un DataSet : La méthode Fill de l'objet TableAdapter ou tableAdaptaterEtudiant pour nous, permet d'extraire les données d'une source de données en exécutant la requête SQL spécifiée dans la propriété SelectCommand. Elle prend en paramètre le DataSet instancié et le nom de la DataTable instanciée (tableEtudiant pour nous) à remplir avec les données retournées. Dans notre exemple voici une méthode de notre classe Etudiant: Public Function lireTousLesEtudiants() As Integer 'accès à la base de données tableAdaptaterEtudiant.Fill(tableEtudiant) Return tableEtudiant.Count End Function On récupère donc tous les étudiants dans l'objet "tableEtudiant". La mise à jour de données avec un DataAdapter et un DataSet : La méthode Update de l'objet TableAdapter ou tableAdaptaterEtudiant pour nous, permet de répercuter sur une source de données les modifications effectuées dans un DataSet instancié. Cette méthode admet un objet DataSet qui contient les données modifiées et un objet DataTable optionnel qui contient les modifications à extraire. Dans notre exemple voici un extrait d'une méthode de notre classe Etudiant permettant de supprimer un étudiant de la base de données : Dim numligne As Integer Dim numerreur As Integer Dim nombre As Integer ' remplir la table avec le contenu de la base nombre = lireTousLesEtudiants() 'on recherche la ligne correspondant au numéro de l’étudiant pour cela on trie tableEtudiant.DefaultView.Sort = "numero ASC" 'ici on récupère le numéro de ligne correspond au numéro de l’étudiant numligne = tableEtudiant.DefaultView.Find(numero) 'si la clef n'est pas trouvée dans la table If numligne = -1 Then numerreur = 1 Else numerreur = 0 'Supression de la ligne tableEtudiant.DefaultView(numligne).Delete() 'accès à la base de données par appel à la couche persistance tableAdaptaterEtudiant.Update(tableEtudiant) End If Return numerreur On marque donc comme supprimée la ligne de la tableEtudiant concernant l'étudiant à supprimer avant de répercuter dans la base de données. Ici la tableEtudiant contient tous les étudiants, on aurait pu imaginer de ne recharger la tableEtudiant qu'avec l'étudiant à supprimer. Mais comment ADO .NET assure-t-il la relation entre les données d'un DataSet instancié et celles contenues dans une base de données? En réalité, lorsque la méthode Update est invoquée l'objet TableAdapter analyse les modifications effectuées au niveau de la collection DataRow. En fonction des modifications rencontrées, les 5 Marie-pascale Delamare d'après Visual Basic 2010 Éditions ENI et les documentations Microsoft. commandes InsertCommand, UpdateCommand et DeleteCommand sont appelées par l'objet TableAdapter, pour peu quelles soient définies. GÉNÉRER LES MÉTHODES UTILES À L’APPLICATION AU SEIN DU DATAADAPTER On double clique sur le « DataSet.xsd ». On sélectionne « EtudiantTableAdapter » et on clique droit pour choisir Ajouter. Un nouveau menu apparait permettant de définir toutes les requêtes dont nous pourrions avoir besoin dans notre application. Exercice : Justement dans cette application nous avons besoin de sélectionner tous les étudiants, sélectionner un étudiant par son numéro, mettre à jour les données d'un étudiant en connaissant sa clef, supprimer un étudiant en connaissant sa clef ou encore insérer un nouvel étudiant. Si vous avez tout compris, vous savez que dans les programmes nous allons travailler sur le DataSet instancié, mais que les commandes SQL nécessaires doivent être définies au niveau du TableAdapter pour répercuter les modifications faites sur le DataSet dans la base de données. Écrire les requêtes SQL nécessaires à notre application. Les intégrer dans le EtudiantTableAdapter. 6 Marie-pascale Delamare d'après Visual Basic 2010 Éditions ENI et les documentations Microsoft.