[VS 2010] Les 3 extensions à posséder sur Visual Studio 2010

2. September 2010 by Aymeric.Lagier
Visual Studio 2010 intègre un module d'extensions afin de personnaliser ou ajouter des fonctionnalités à l'IDE. Ce module d'extensions est disponible dans Tools -> Extension Manager ou via l'icône  de la barre d'outils.

Via la rubrique Online Gallery, vous pouvez ajouter simplement des extensions à Visual Studio 2010.

Dans cet article, je vous propose de découvrir 3 extensions qui à mon sens sont inévitables pour gagner du temps et de la lisibilité :

  • Productivity Power Tools
Ce module, le plus complet des 3 extensions présentées dans cet article ajoute une multitude de fonctionnalités qu'il n'est pas possible d'énumérer dans un seul article. Parmi les fonctionnalité les plus utiles :
  • En faisant Ctrl + Click sur une variable ou une méthode, Visual Studio 2010 ouvre le fichier contenant la définition de ce qui a été cliqué et surligne la 1re ligne de déclaration.
  • L'ajout de guideline (guide) dans une page de code permet d'aligner des éléments, ou de ne pas dépasser un certain nombre de caractères par ligne. Pour ajouter un guide, placez le curseur à l'endroit où vous souhaitez ajouter le guide, puis click droit -> Guidelines -> Add Guideline
  • le Solution Navigator permet de classer les fichiers ouverts, édités, sauvegardés, etc.... Le solution Navigator se trouve à côté du Solution Explorer
Beaucoup d'autres fonctionnalités sont disponibles via ce module : auto-complétion, informations sur les variables, etc...
  • VS10x Code Map
Ce module ajoute sur la droite ou la gauche de la fenêtre de code une carte du code regroupé par régions, méthodes, etc... une simple click sur la méthode en question affiche la 1re ligne de la définition de la méthode dans la page de code. Ce module permet également de déplier ou replier toutes les régions contenu dans la page.

Code map pour Visual Studio 2010

  • VS10x Method Block Highlighter
Ce module fonctionne avec VS10x Code Map et permet de surligner la définition complète d'une méthode lorsque l'on clique sur la méthode en question dans le Code Map décrit ci-dessus. Un click droit sur une méthode dans le Code Map puis Highlight In Code -> Green permet de surligner toute la méthode de façon permanente en vert. Très utile pour se repérer rapidement dans le code.

Pour plus de modules rendez-vous sur le site de la galerie Visual Studio 2010.

URL originale de l'article

Visual Studio 2010 , ,

Réduire le temps de chargement d'une page ASP.NET avec le SQL Server Cache Dependency

14. May 2010 by Aymeric.Lagier

Un système de cache permet de mettre temporairement des données en mémoire sur le serveur permettant un affichage plus rapide des pages du site web.

En ASP.NET, il existe plusieurs solutions pour créer un système de cache :

  • Output Caching : Une copie de la page web finale (HTML) est stockée sur le serveur. Lors du prochain appel à la page, la copie stockée sera automatiquement rendue au client n’exécutant ainsi pas les requêtes SQL, traitements côté serveur, etc… La copie expirera automatiquement après un temps préalablement configurée ou si le serveur manque de mémoire.
  • Data Caching : Il est possible de stocker en mémoire sur le serveur des données comme un DataSet. Si le DataSet est mis en cache, on évite ainsi un appel à la base de données. Contrairement à l’Output Caching, c’est à vous de définir les objets qui seront mis en cache.

Dans cet article, c’est une partie du Data Caching qui nous intéresse : le SQL Server Cache Dependency. Le principe de cette méthode de caching est de limiter les appels à la base de données en mettant en cache le résultat d’une requête SQL et en l’utilisant tant que la table à qui elle fait appel n’est pas modifiée.

Concrètement si un GridView utilise un SqlDataSource pour récupérer toutes les colonnes de la table MaTable dans une base de données.

  • Sans SQL Cache Dependencies, à chaque exécution de la page, un appel à la base de données sera fait pour récupérer les informations dans la table MaTable.
  •  Avec SQL Cache Dependency, lors de la première exécution de la page un appel à la base de données sera fait puis lors de chaque appel le résultat de la requête sera récupéré dans le cache. Si la table vient à être modifiée, un nouvel appel à la base de données sera fait, et ainsi de suite.

Comment mettre en place le SQL Server Cache Dependency

Attention, la mise en place décrite ci-dessous ne fonctionne que sur SQL Server 2005 et plus. Pour SQL Server 2000 le SQL Cache Dependency est possible, mais beaucoup plus lourd à mettre en place.

Premièrement, pour activer les notifications sur SQL Server (qui permettront d’avertir du changement dans une table), démarrer Visual Studio Command Prompt (Démarrer -> Tous les programmes -> Microsoft Visual Studio 2010 -> Visual Studio Tools -> Visual Studio Command Prompt).

Tapez ensuite : SqlCmd -S <Serveur_de_base_de_données>

command_prompt

Entrez ensuite les requêtes suivantes :

1 USE <Base_de_données>
2 ALTER DATABASE <Base_de_données> SET ENABLE BROKER
3 GO

Attention, pour que cette requête s’exécute avec succès, aucune autre session ne doit être ouverte pour cette base de données.

Il faut ensuite ajouter une entrée dans le web.config pour indiquer que la base de données utilisera le cache :

1 <system.web>
2     <caching>
3       <sqlCacheDependency enabled="true">
4         <databases>
5           <add name="Ma_Base" connectionStringName="Site" pollTime="20000"/>
6         </databases>
7       </sqlCacheDependency>
8     </caching>
9 </system.web>
  • name : Nom de la base de données
  • connectionStringName : nom de la chaine de connexion définie dans le web.config
  • pollTime : temps entre chaque notification (ici 20s)

Il faut ensuite activer les notifications pour la base de données et pour la table concernée. Pour pouvoir accéder à la classe SqlCacheDependencyAdmin, importez System.Web.Caching dans votre page.

1 string cnx = ConfigurationManager.ConnectionStrings["Site"].ToString();
2 SqlCacheDependencyAdmin.EnableNotifications(cnx);
3 SqlCacheDependencyAdmin.EnableTableForNotifications(cnx, "Ma_Table");

Dernière étape, activer le Cache dans les propriétés du SqlDataSource ou ObjectDataSource.

cache_datasource

EnableCaching doit être passé à true et SqlCacheDependency doit contenir MaBase:MaTable.

Il faut noter qu’une table AspNet_SqlCacheTablesForChangeNotification est créée pour stocker les changements dans la base de données. A chaque modification le champ changeId est incrémenté de 1.

Les performances

Pour démontrer les performances de ce système de cache, j’ai fait des tests sur une requête SQL qui récupère les 34487 villes de France. Le test se base sur 10 exécutions de page dans les 2 cas et avec une désactivation du cache du navigateur.

Sans cache, l’exécution moyenne des pages est de 0,4825s alors qu’avec le cache, on obtient une exécution moyenne de 0,0284s soit une exécution 17 fois inférieure.

resultat

Il est possible de télécharger ici le projet utilisé pour les tests.


, ,

Introduction à ADO.NET en C#

4. April 2010 by Aymeric.Lagier

ADO.NET est un ensemble de composants présents de base dans le framework .NET permettant l'accès et la gestion de données situées sur une base de données relationnelle (SQL Server, Oracle, etc...) ou non. ADO.NET est une évolution de ADO (ActiveX Data Objects). Les classes ADO.NET peuvent être divisées en 2 parties. Les classes permettant de se connecter à la source de données et les classes utilisées pour gérer les données.

La connexion à la source de données

Pour se connecter à une base de données via ADO.NET un Data Provider (fournisseur de données) correspondant à la base de données utilisée. Ainsi le Data Provider de SQL Server est optimisé pour fonctionner avec les bases de données SQL Server, idem pour le Data Provider Oracle. Tous les Data Providers sont dérivés d'une seule et même classe, ils implémentent les mêmes méthodes, propriétés, et fonctionnent donc de la même manière. Dans certains cas, les Data Providers peuvent implémenter des fonctionnalités spécifiques à la base de données utilisée (exemple des requêtes XML pour SQL Server). Les 4 fournisseurs de données inclus dans le framework .NET :

  • SQL Server Provider : pour SQL Server 7.0 et plus).
  • OLE DB provider : pour toutes les bases de données disposant d'un pilote OLE DB (Object Linking and Embedding).

Note:

OLE DB est une interface basée sur COM (Component Object Model) utilisée pendant plusieurs années avec ADO (ActiveX Data Objects), la plupart des bases de données ont donc un pilote OLE DB (MySQL, Access, Oracle SQL Server, etc..). Si la source de données ne propose pas de pilote OLE DB, vous pouvez le créer vous-même. Comme dit précédemment, OLE DB propose des pilotes pour SQL Server et Oracle qui ont déjà des Data Providers dédiés. Il est donc tout à fait possible d'utiliser OLE DB à la place du SQL Server Provider. La seconde méthode (SQL Server Provider) est préférable car elle offrira de meilleures performances.
  • Oracle provider : pour Oracle (version 8i et plus).
  • ODBC provider : pour toutes les sources de données qui ont un pliote ODBC (Open DataBase Connectivity).

Note :

ODBC est une suite de pilotes permettant la communication avec la pulpart des SGBD (Système de Gestion de Base de Données) du marché comme MySQL, Oracle, DB2, PostgreSQL, etc...

Côté code, les classes des Data Providers se trouvent dans les namespaces suivants :

  • System.Data.OleDb
  • System.Data.SqlClient
  • System.Data.OracleClient
  • System.Data.Odbc
Il ne faut pas oublié de rajouter à ces namespaces, System.Data qui contient les classes essentielles au fonctionnement d'ADO.NET. Déclaration d'un Data Provider pour SQL Server :

Déclaration des namespaces

Création de la connexion On construit donc la connexion avec la ConnectionString qui indique le serveur de base de données (localhost\SQLEXPRESS), la base de données (Northwind) et la manière de s'authentifier sur le serveur (SSPI). Note :
L'exemple ci-dessus utilise le Data Provider de SQL Server. Pour les autres Data Providers, il suffit de remplacer SqlConnection par OracleConnecion, OleDbConnection ou OdbcConnection. Le même principe s'applique pour les commandes qui suivront dans cet article.

La gestion des données

L'un des avantages d'ADO.NET est sa généricité. Peu importe la source de données, le conteneur qui accueillera les données sera le même, le DataSet. Pour faire une analogie avec le C# de base, un DataSet est en quelque sorte un tableau (array), mais spécialement adapté pour accueillir des données venant d'une source de données relationnelle.

ADO.NET peut fonctionner de 2 manières diffèrentes. En mode connecté (Direct Data Access), le programme se connecte à la base de données et fait un certain nombre d'opérations (SELECT, INSERT, UPDATE, etc...), puis la connexion est fermée. Aucune donnée n'est donc stockée en mémoire sur le client. En mode déconnecté, le programme se connecte à la base de données durant un temps très bref pour rapatrier les données en mémoire. La connexion est ensuite interrompue. Une fois les opérations (INSERT, DELETE, etc...) réalisées sur le DataSet, le programme se connecte à nouveau à la base de données et sauvegarde les changements.

Quel mode choisir ?

L'utilisation du mode connecté est recommandé pour les sites web en ASP.NET puisque le cycle de vie d'un programme est totalement différent par rapport à une application de bureau. Dans une page web, le cycle de vie du programme n'est que de quelques secondes, les données n'ont donc pas besoin d'être stockées en mémoire. Concernant les applications lourdes, le mode déconnecté est utile lorsqu'il y a de nombreux traitements à faire sur les données avant de les modifier dans la base de données.

Le mode Connecté (Direct Data Access)

La commande SELECT

Détails du code :

Premièrement, il faut déclarer la connexion à la base de données, puis définir la requête à exécuter. On déclare un SqlDataReader qui contiendra nos données une fois la commande SQL exécutée. La suite du code est imbriqué dans un bloc try/catch/finally afin de gérer les éventuelles erreurs qui pourraient survenir. La connexion à la base de données est ouverte et la requête exécutée. La boucle while permet de parcourir tous les enregistrements afin de les afficher dans la console. A la fin de l'opération, on ferme le SqlDataReader ainsi que la connexion à la base de données. Le bloc finally permet de fermer la connexion à la base de données dans tous les cas (succès de la requête ou erreur).

Les commandes INSERT, UPDATE et DELETE

Le principe est le même, à l'exception du DataReader qui n'est plus utile et de la méthode permettant d'exécuter la requête : ExecuteReader() qui devient ExecuteNonQuery() puisque la requête ne renvoie que le nombre de lignes modifiées.

Le processus est identique pour le INSERT et le DELETE.

La protection des données dans les requêtes

Dans la requête ci-dessus, 'ALFKI' est inscrit en dur dans la requête, cela ne pause donc pas de problème. Si maintenant le CustomerID est une valeur entrée par l'utilisateur du programme. Si l'utilisateur entre la valeur 'ALFK'I, le programme affichera une erreur. Deuxième problème, les injections SQL. L'utilisateur du programme peut délibérément entrer des paramètres spéciaux qui détourneront la requête de son but initial.

Pour contrer ce type de problème, ADO.NET met en place les requêtes paramètrées : Requête normale : Requête paramétrée :

De cette manière un utilisateur peut entrer n'importe quelle chaine de caractères dans myVar, il n'y aura pas de problème d'injection SQL ni de chaine invalide. Ce processus fonctionne également pour le mode déconnecté expliqué ci-dessous.

Le mode Deconnecté (Direct Data Access)

La commande SELECT

Pour le mode déconnecté la processus est diffèrent. Le programme établit une connexion avec la base de données, récupère les données et referme immédiatement la connexion. Les opérations sur les données (affichage dans la console) ne se font qu'une fois la connexion fermée.

Détails du code :

Comme pour le mode connecté, la connexion à la base de données et la requête SQL sont déclarées. A la place du SqlDataReader, le SqlDataAdapter et le DataSet sont déclarés. Le SqlDataAdapter va permettre au programme de récupérer les données qui seront stockées dans le DataSet. Une fois les données enregistrées en mémoire, la connexion à la base de données est interrompue. Après la fermeture de la connexion, le programme peut traiter les données (affichage sur la console) contenues en mémoire.

Les commandes INSERT, UPDATE, DELETE

Pour les requêtes INSERT, UPDATE et DELETE, le processus est le même. C'est-à-dire se connecter à la base de données pendant un très court instant afin de charger la table qui nous intéresse en mémoire pour ensuite travailler dessus.

Détails du code : Comme dans la requête SELECT, la connexion et la requête SELECT sont définies. Petite nouveauté, la définition d'une commande UPDATE en plus de la commande SELECT ainsi que la déclaration de paramètres correspondants aux champs de la requête UPDATE. Après le stockage des données dans la mémoire, la modification des données peut s'opérer. Une fois les modifications réalisées, la méthode Update() de DataAdapter prend en paramètre la DataTable modifiée et envoie les données dans la base de données. Les exemples de cet article sont repris dans ce projet. Attention, pour fonctionner ce projet a besoin de la base de données Northwind disponible ici.

Conclusion

Cet article introduit l'ensemble de classes utilisées pour interagir avec une base de données en .NET en utilisant le mode connecté principalement pour l'ASP.NET et le mode déconnecté pour les applications de bureau exécutant un nombre important d'opérations sur les données. ADO.NET offrent d'autres fonctionnalités comme les relations entre les tables avec la classe DataRelation.

ADO.NET, C# , ,