2009-06-25 5 views
0

Le problème d'aujourd'hui dans mon code est un peu étrange, et je ne pouvais pas encore le reproduire. Je travaille avec un jeu de données typé (créé avec le concepteur) et je boucle sur toutes les lignes dans une base de données.DataSet: Enumerator et FindById ne retournent pas égal DataRow

Parfois (!), Lors de la recherche via la clé primaire, la ligne retournée n'est pas égale à celle de l'énumérateur. Ceci est un code que j'ai écrit de reproduire le problème:

foreach(DataSet1.DataTable1Row dr in ds.DataTable1) 
{ 
    if(ds.DataTable1.FindById(dr.Id) != dr) 
     Console.Write(dr.Id); 
} 

Aucune ligne sera écrite à la console, car findById retourne toujours la même ligne, ce qui est vraiment logique. Dans mon code de projet, avec un ensemble de données similaire avec quelques colonnes de chaîne, dans environ 3% des lignes (! Toujours les mêmes lignes) elle ne présente pas, et l'un des champs de chaîne est tout simplement vide:

ds.DataTable1.FindById(dr.Id) != dr // returns false, for whatever reason 

La clé primaire est le seul champ de clé primaire et, par conséquent, FindById est une méthode générée. Est-ce que quelqu'un sait un petit indice ou a connu le même problème avant? J'ai peur que ce soit un cas très spécial que j'ai fait qui permet ce bug ou cette fonctionnalité. :)

J'ai pensé à la possibilité que cela soit produit par le casting effectué par l'énumération. L'énumérateur fonctionne avec le type de base DataRow des lignes typées générées. Mais je ne trouve pas quelque chose de mal là ...

Vive Matthias

Répondre

2

Quel est le type de clé primaire vous? le DataSet a un bug subtil pour comparer les Guids (et éventuellement d'autres valeurs). L'erreur de Guid ne concerne que certaines valeurs de Guid et fonctionne généralement bien.

Note: Quand je dis avoir un bug, je veux dire que je sais qu'un rapport de bug a été accepté, mais je ne sais pas si elle a été fixe aussi bien

+0

Merci! Le type est une chaîne, mais en fait il y a des GUID stockés dans le champ. Ceci est donné, je ne peux pas changer. –

+0

Le travail que j'ai proposé lorsque j'ai soumis l'erreur (il y a 3 ans si je ne me trompe pas) consistait à utiliser SQL pour transformer le GUID en chaîne. cela a malheureusement un impact très réel sur les performances du SQL. Si vous ne pouvez pas faire cela, vous pouvez convertir (au moins pour le débogage) la table en un dictionnaire avec la clé du dictionnaire étant la clé primaire et la valeur étant la ligne. Autant que je me souvienne, le problème n'était pas lié à GetHashKey –