"Ne remettez jamais à l'exécution ce qui peut être fait au moment de la compilation."
David Gries, Construction de compilateurs pour ordinateurs numériques
Introduction
En tant que programmeurs, lorsque nous apprenons de nouvelles technologies, les exemples peuvent parfois être notre plus grand ennemi. Les directives sont souvent conçues pour être simples et faciles à comprendre, mais elles peuvent en même temps conduire à une augmentation de l’écriture de code paresseuse, inefficace et même dangereuse. La situation la plus courante comme celle-ci se situe dans le paradigme ADO.NET. Dans cet article, nous verrons ce que signifie avoir des objets fortement typés dans une base de données, ce qui vous permet de le faire dans vos programmes, malgré le manque d'exemples.
Un peu plus précisément, nous verrons comment les jeux de données fortement typés sont créés et utilisés dans Visual Studio 2005. Comme cet article l’explore, les ensembles de données fortement typés offrent de nombreux avantages par rapport aux autres techniques d’accès aux données faiblement typées. Nous verrons également ici que créer et utiliser des ensembles de données fortement typés ne devient pas plus simple avec Visual Studio 2005. Si vous souhaitez en savoir plus, continuez à lire.
Les bases et les avantages des objets fortement typés
Pour comprendre ce que signifie le typage fort, vous pouvez d'abord penser aux rencontres. Si vous étiez célibataire, avec quel type de personne envisageriez-vous de sortir avec quelqu'un ? Vous pouvez avoir des critères spécifiques (comme être en bonne santé et attrayant), ou les critères peuvent être simples ou peu clairs. Quelles que soient vos conditions, lorsque vous décidez avec qui passer plus de temps, vous utiliserez toujours vos propres normes pour peser et prendre en compte ces types. Si vous êtes intelligent, vous réfléchirez beaucoup pour vous protéger des traumatismes émotionnels. Vous constaterez peut-être que, par exemple, être avec un alcoolique est instable à moins que les deux ne soient dans une relation sérieuse. Cependant, il est douloureux et très difficile de faire changer une personne. Par conséquent, votre sagesse vous demandera de mettre fin à la relation avant même qu’elle ne commence. L'ajout d'une clause d'interdiction de boire à vos critères de rencontres vous protégera d'un futur chagrin d'amour et vous permettra de concentrer votre temps et votre énergie sur de meilleurs candidats.
Vous pourriez être surpris de voir à quel point ce raisonnement a quelque chose à voir avec la programmation. Ce n’est pas grave, viens avec moi, chère lectrice ! Les objets d'accès aux données ADO.NET sont conçus pour être extrêmement flexibles. Lorsque vous lisez des données à partir d'une base de données, vous travaillez probablement avec de nombreux types d'objets courants autorisés par le framework .NET normal, à moins que vous ne rencontriez des problèmes particuliers. En appliquant notre théorie des rencontres, vous pouvez essentiellement considérer vos données pertinentes comme des objets universels. "Tant que mon rendez-vous ne pose pas trop de problèmes." Tu ne peux pas être plus clair ? Il n’y a pas de limite même s’il s’agit d’un humain ou d’une autre créature vivante ! En tant qu'ami, je vous implore : « Plus de normes ! Réduisez votre liste !
Tout comme négliger avec qui vous sortez peut entraîner des problèmes relationnels à l'avenir, laisser vos objets non cochés dans votre code peut également provoquer des erreurs. De plus, si vous laissez d'anciens objets errer dans votre sous-programme, vous ne remarquerez peut-être pas qu'il s'agit d'un problème jusqu'à ce que le programme soit en cours d'exécution. Pour utiliser notre théorie des rencontres, détecter les erreurs au moment de l’exécution, c’est comme si votre partenaire avait une dispute douloureuse et gênante au milieu d’un restaurant italien branché. Oui, voyez-vous, si vous aviez planifié à l'avance, vous ne vous seriez pas retrouvé avec une bande de convives qui vous regardaient, et cela n'aurait pas été gênant. En appliquant simplement des normes plus strictes à votre code, vous pouvez détecter les erreurs avant que votre programme ne commence à compiler. Par exemple, l'exemple de code suivant :
string FirstName = myrow.("FirstName").ToString();
Le DataRow dans cet exemple n'est pas typé et, par conséquent, vous devez utiliser le nom de la colonne comme chaîne pour obtenir la valeur dont vous avez besoin (ou vous pouvez choisir d'utiliser l'index de la colonne dans la collection de colonnes de l'enregistrement). Heureusement, cette colonne existe. Le type de données de la colonne DataRow est object. Nous supposons que le type de données sous la colonne FirstName est une chaîne et nous devons le convertir explicitement en chaîne avant de l'utiliser. Si le nom de cette colonne change (par exemple, devient PersonFirstName), le compilateur n'a aucun moyen de vous en informer. Déprimé? Mais vous n’êtes pas obligé. Si votre code ressemble à ceci, votre vie sera plus simple et votre code sera plus fiable.
string FirstName = PersonRow.FirstName;
Dans ce deuxième exemple, nous utilisons une ligne fortement typée, et nous savons que la propriété FirstName est de type string. Pas de noms de colonnes compliqués, pas de conversions de types compliquées. Le compilateur a déjà effectué la vérification du type pour nous, et nous pouvons effectuer d'autres travaux en toute sécurité sans nous soucier de savoir si nous avons correctement tapé les noms de colonnes.
Tout le reste est identique, vous n'hésiterez donc pas à l'utiliser à la place du type générique. Mais attendez une minute, d’où viennent les objets fortement typés ? J'aimerais également pouvoir vous dire que ces objets sont créés automatiquement. Mais tout comme de bonnes relations demandent du temps et des efforts, rendre vos objets fortement typés demande des efforts supplémentaires. Mais le temps supplémentaire passé ici en vaut vraiment la peine, et cela permet d'économiser de manière exponentielle plus de temps passé à « attraper des bugs » à l'avenir.
Il existe plusieurs façons de réaliser un typage fort, et nous consacrerons le reste de cet article à expliquer comment créer un ensemble de données fortement typé dans Visual Studio 2005. Nous comparerons également les avantages et les inconvénients de cette approche avec d’autres approches.
Création d'ensembles de données fortement typés dans Visual Studio 2005
Les ensembles de données fortement typés ne sont en réalité que des colonnes et des tableaux prédéfinis d'ensembles de données ordinaires, de sorte que le compilateur sait déjà ce qu'ils contiennent. Au lieu d’un emballage lâche qui vous va comme un gant de baseball, les ensembles de données fortement typés vous vont comme un gant. Chaque version successive de Visual Studio facilite la gestion des ensembles de données fortement typés. Dans l'exemple suivant, nous utiliserons la base de données AdventureWorks de SQL Server 2005. Suivez simplement ces étapes :
1. Ouvrez Visual Studio et créez un nouveau site Web ASP.NET.
2. Dans la fenêtre Explorateur de solutions, cliquez avec le bouton droit pour ajouter un nouvel élément et sélectionnez DataSet. Nommez-le AdventureWorks.xsd (voir capture d'écran). Visual Studio vous recommandera de placer le fichier DataSet dans le fichier App_Code et il vous suffira de cliquer sur Accepter.
3. Après avoir ouvert AdventureWorks.xsd en mode conception, l'assistant de configuration de TableAdapter s'exécutera. À ce stade, cliquez sur Annuler et nous ferons glisser le tableau souhaité depuis l'Explorateur de serveur.
4. Parcourez pour trouver la base de données AdventureWorks dans la barre d'outils de l'Explorateur de serveur. (Si vous n'avez pas installé la base de données AdventureWorks, vous pouvez accéder à la page de téléchargement de Microsoft Exemples et bases de données SQL Server 2005 pour la télécharger ainsi que d'autres exemples SQL Server 2005)
5. Faites glisser les tables SalesOrderHeader et SalesOrderDetail dans la fenêtre de conception DataSet. La fenêtre devrait ressembler à la capture d'écran. Que voyons-nous ? Chaque fois que nous ajoutons une table, Visual Studio crée un DataTable fortement typé (avec le même nom que la table d'origine) et un TableAdapter. Ce DataTable a défini chaque colonne pour nous. TableAdapter est ce que nous utilisons pour remplir la table. Par défaut, il existe une méthode Fill() pour obtenir chaque ligne de données de la table d'origine.
Dans l’état actuel des choses, cet ensemble de données fortement typé renverra tous les enregistrements des deux tables. Mais la base de données AdventureWorks contient de nombreuses informations sur les commandes, alors pourquoi ne pas créer une requête plus explicite ? Nous pouvons ajouter des méthodes à l'objet TableAdapter pour obtenir un ensemble de sous-enregistrements spécifique. Cliquez avec le bouton droit sur SalesORderHeaderTableAdapter et sélectionnez Ajouter|Requête. Sélectionnez « Utiliser les instructions SQL » et cliquez sur Suivant, puis sélectionnez « SELECT qui renvoie les lignes » et cliquez sur Suivant. Récemment, saisissez la requête suivante dans la fenêtre (ou vous pouvez utiliser Query Builder pour effectuer le travail) :
SÉLECTIONNER
SalesOrderID, RevisionNumber, OrderDate, DueDate, ShipDate,
Statut, OnlineOrderFlag, SalesOrderNumber, PurchaseOrderNumber,
Numéro de compte, ID client, ID de contact, ID de personne commerciale, ID de territoire,
BillToAddressID, ShipToAddressID, ShipMethodID, CreditCardID,
Code d'approbation de carte de crédit, ID de taux de change, sous-total, montant des taxes, fret,
TotalDue, Commentaire, rowguid, ModifiedDate
FROM Sales.SalesOrderHeader
OÙ (Date de commande > @Date de commande)
Cette requête SQL est une simple requête SELECT, utilisant un paramètre @OrderDate pour filtrer les résultats. Cela nous évitera de renvoyer tous les enregistrements de la base de données. Gardez les cases à cocher « Remplir un DataTable » et « Retourner un DataTable » sélectionnées et cliquez sur Terminer. Après avoir ajouté cette instruction SELECT, votre concepteur devrait maintenant ressembler à la capture d'écran, avec une requête supplémentaire sous SalesOrderHeaderTableAdapter.
Une fois l'ensemble de données fortement typé établi, nous pouvons facilement afficher les données dans la page ASP.NET avec quelques lignes de code. Créez une nouvelle page ASP.NET sur le site Web et passez en mode conception. Faites glisser un contrôle GridView dessus et laissez son ID comme GirdView1. Accédez ensuite à la page de code source et introduisez l'espace de noms AdventureWorksTableAdapters au-dessus du fichier (la syntaxe en c# utilise AdventureWorksTableAdapters ;). Enfin, ajoutez le code suivant à l'événement Page_Load :
// Création du SalesOrderHeaderTableAdapter
SalesOrderHeaderTableAdapter salesAdapter =
new SalesOrderHeaderTableAdapter();
// Récupère les commandes passées après le 1er juillet 2004
Commandes AdventureWorks.SalesOrderHeaderDataTable =
salesAdapter.GetDataBy(new DateTime(2004, 7, 1));
// Lier les résultats de la commande au GridView
this.GridView1.DataSource = Commandes ;
this.GridView1.DataBind();
Le code est très simple. Nous créons une instance de SalesORderHeaderTableAdapter pour remplir la table de données. Ce qu'il faut noter ici, c'est que contrairement à un DataTable ordinaire, nous déclarons un objet de type SalesORderHeaderDataTable. Nous appelons la méthode GetDateBy() et passons un objet DateTime pour remplir les données. Notez également ici que la commande obtenue est également fortement typée, il faut donc passer un objet DateTime au lieu d'un objet ordinaire. La capture d'écran ci-dessous est le résultat de l'exemple de code ci-dessus.
En plus d'utiliser du code pour lier le jeu de résultats au GridView, vous pouvez également utiliser un ObjectDataSource, définir sa propriété TypeName sur AdventureWorksTableAdapters.SalesOrderHeaderTableAdapter et définir son SelectMethod sur GetData ou GetDataBy.
En plus de ne pas avoir à écrire de code pour se connecter à la base de données, un autre grand avantage de l'utilisation d'un ensemble de données fortement typé est qu'il n'y a pas de chaîne de nom de colonne cachée dans notre code que le compilateur ne puisse pas vérifier. Nous n’avons pas non plus besoin d’effectuer de conversion de type. Si le schéma de la base de données change, mettez simplement à jour le fichier AdventureWorks.xsd et nous constaterons que toutes les modifications associées sont automatiquement effectuées au moment de la compilation.
Autres techniques pour générer des applications d'accès aux données fortement typées
Outre l'utilisation d'ensembles de données fortement typés, il existe d'autres moyens d'implémenter un typage fort dans vos programmes. Vous pouvez créer des classes personnalisées plus légères que les DataSets et plus cohérentes avec votre base de données. Certains développeurs de logiciels tiers ont également développé des outils pour automatiser ce processus. L'un des plus spéciaux et mon préféré est LLBLGen Pro. J'ai déjà écrit un livre à ce sujet : Rapid C# Windows Development : Visual Studio 2005, SQL Server 2005 et LLBLGen Pro. (Vous pouvez lire 1/3 du livre gratuitement sur mon site Web.) Un autre outil populaire est CodeSmith. Même Microsoft développe un petit outil appelé DLINQ, mais il est encore en test et on estime qu'il ne sera pas lancé avant au moins l'année prochaine.
Si vous utilisez l'approche solide des ensembles de données de Visual Studio, l'un des avantages indéniables est que vous n'avez pas besoin d'acheter de logiciel supplémentaire. Toutes ces solutions présentent des fonctionnalités et des avantages différents, mais les principaux avantages sont la fiabilité, moins d'erreurs et moins de temps passé au débogage. Il est également plus facile de vérifier l’impact des modifications du schéma de base de données et d’effectuer la maintenance. J'espère que vous avez réalisé les avantages d'une frappe forte. Bonne chance pour le développement (et les rencontres aussi) !
Par Joseph
Chancelier
Téléchargez le code examiné dans cet article
À propos de l'auteur
Joseph Chancellor est un développeur C# du sud de la Californie qui a connu son lot de traumatismes relationnels. Il apprécie toutes sortes de commentaires et de suggestions. Visitez son blog ou lisez les cinq premiers chapitres de son livre sur Visual Studio 2005, SQL Server 2005 et. LLBGen Pro.
Adresse originale : http://aspnet.4guysfromrolla.com/articles/020806-1.aspx.