Bonjour à tous.
Je viens de me mettre au C#, et j’ai un petit problème en ce qui concerne les DataRow :
J’ai récupéré une DataTable via SQL server contenant les données d’une table Products.
J’ai fait une classe Product, et vu que la table contient facile une cinquantaine de champs, au lieu d’en déclarer autant dans ma classe je préfère garder directement la DataRow concernant un produit, plus 3 champs qui sont plus souvent utilisés : l’ID du product (un int), son nom et son code (des string). En plus, c’est plus pratique pour les updates.
Voici le constructeur de ma classe Product :
[code] public Product(DataRow dataRow)
{
row = dataRow; // row est un champ de la classe
productID = (int)row["ProductID"];
productCode = (string)row["ProductCode"];
productName = (string)row["ProductName"];
}[/code]
Comme vous pouvez le constater, pour l’ID, le code et le nom je fais des cast, et ca passe nickel, si je fais un writeline de chaque, il me les affiche bien.
Maintenant, j’ai mis chaque champ de la DataRow en propriété, et c’est là que ca se corse :
public int FamilyID
{
get
{
return (int)row["ProductID"];
}
}
En effet, ce genre d’accès passe à la compilation, mais pas à l’exécution, où j’ai droit à une belle InvalidCastException, quel que soit le type du champ à renvoyer (int, float, booleen ou string).
J’ai essayé de remplacer les types primitifs par des objets (int => Int32, float => Double …etc…), ce qui donne pour l’exemple précédent :
public Int32 FamilyID
{
get
{
Int32 i = (Int32) row["FamilyID"];
return i;
}
}
Quand je fais comme ça, ça foire pour tous les champs en Int32, le reste ça passe à peu près à part quelques uns qui me lévent toujours la même exception…
La seule solution que j’ai trouvé pour remédier à ça est de parser les champs numériques à partir du toString() de chaque valeur dans la DataRow mais quand même, c’est sale comme façon de faire :
public intFamilyID
{
get
{
int i = int.Parse(row["FamilyID"].toString());
return i;
}
}
Voilà, je me suis pris la tête la dessus toute la matinée, et j’aimerais bien savoir pourquoi le cast marche sans problème dans le constructeur, et pas dans les propriétés. Quelqu’un peut-il m’éclairer là-dessus ?
Je précise que je programme sous visual studio .NET 2003
Merci.