août
2008
Aujourd’hui mon patron m’interpelle concernant un comportement étrange d’une procédure stockée avec Linq to SQL. La procédure stockée est un simple « SELECT field1, COUNT(*) » et pourtant impossible de récupérer un résultat correct.
Histoire de pouvoir vous montrer des exemples concrets, je vais transposer la situation avec l’utilisation de la base de données Northwind.
Comme je vous le disais, la procédure stockée récalcitrante consiste à récupérer la liste des clients avec le nombre de commandes qu’ils ont passé :
CREATE PROCEDURE GetCustomersWithOrderCount |
Au niveau du projet, un modèle Linq to SQL Classes auquel on a ajouté la procédure stockée « GetCustomersWithOrderCount ».
Comme on peut le voir dans le code généré, Linq to SQL a déduit la classe correspondant au résultat que la procédure stockée va renvoyer. En l’absence d’alias sur le champ « COUNT(*) », le nom « Column1″ a été donné par défaut.
public partial class GetCustomersWithOrderCountResult |
Tout semble correct et on peut donc écrire le code qui va récupérer le résultat de la procédure stockée que nous avons précédemment créé :
using (ModelDataContext ctx = new ModelDataContext()) |
Pourtant, lorsqu’on lance le programme, on obtient un résultat plus qu’étrange :
On récupère bien nos clients mais par contre aucune valeur pour le nombre de commandes et ce pour tous les clients ! Après une heure de recherche, je trouve enfin la solution via MSDN (une fois de plus ;)).
Ce qui se passe, c’est que Linq to SQL ne sait pas comment mapper le champ « COUNT(*) » de la procédure stockée à la propriété « Column1″ de la classe « GetCustomersWithOrderCountResult » générée automatiquement.
La solution est donc simple : il suffit de donner un alias à notre champ dans la procédure stockée :
ALTER PROCEDURE GetCustomersWithOrderCount |
Après une mise à jour du schéma Linq to SQL Classes, on peut remarquer que le changement a été pris en compte dans la classe « GetCustomersWithOrderCountResult ». La propriété « Column1″ a bien été renommée en « OrderCount ».
public partial class GetCustomersWithOrderCountResult |
Et lorsqu’on exécute à nouveau notre code, on a enfin notre résultat tant attendu :
Tout ça pour ça vous allez me dire mais c’est bon de le savoir quand même car au final, je peux vous assurer que l’on a perdu beaucoup de temps avant de comprendre ce qui n’allait pas
N’hésitez pas à réagir en laissant un commentaire.
Déménagement
Next Microsoft CEO
Articles récents
- Changement d’adresse de ce blog
- Article : les nouveautés de C# 5.0
- Modèle Entity Framework généré avec SQL Server 2008 et utilisé sous SQL Server 2005
- Les photos, vidéos et cadeaux des TechDays 2011
- La première journée en ligne sur TechDays TV
- Suivez les TechDays 2011 comme si vous y étiez sur la chaîne TechDays TV
- Téléchargez le programme des conférence des TechDays 2011
- Dernier jour des TechDays = plus de chance de remporter des cadeaux sur le stand de dvp !
- Venez à notre rencontre lors des TechDays 2011
- Les flux à ne pas rater lors des TechDays 2011
- Les TechDays 2011 s’invite sur votre smartphone Windows Phone 7
- Exclu des cadeaux du concours Developpez.com lors des TechDays 2011
- Ouverture de la galerie d’images sur notre site des TechDays
- Partagez votre expérience des Microsoft TechDays
- Grand concours Microsoft “FAN des TechDays 2011” : épisode 2 !
- Mettez-vous aux couleurs des TechDays 2011 !
- Developpez.com aux TechDays 2011
- Le Challenge Azure 2010 est fini !
- Suivez la keynote de la pdc10 en direct sur internet à 18h !
- MVP Visual C# 2010 – 2011 !!!