DataTable.Les lignes.Find() de ne pas trouver de ligne
Je suis en train de rechercher un DataTable pour une ligne que je connais existe.
//This is the row my search should find
DataRow goal = dtLkupCat.Rows[6];
//This finds the row correctly
string srchexpr = String.Format("sport = '{0}' and catcode = '{1}' and type = '{2}' and [parent] = '{3}' and code = '{4}'", goal["sport"], goal["catcode"], goal["type"], goal["parent"], goal["code"]);
DataRow[] test = dtLkupCat.Select(srchexpr);
//But if I set a PK and search for the values I know to be correct, it returns null
dtLkupCat.PrimaryKey = new DataColumn[] { dtLkupCat.Columns["sport"],
dtLkupCat.Columns["catcode"],
dtLkupCat.Columns["type"],
dtLkupCat.Columns["parent"],
dtLkupCat.Columns["code"]};
DataRow lkup = dtLkupCat.Rows.Find(new object[] { goal["sport"], goal["catcode"], goal["type"], goal["parent"], goal["code"] });
Il n'y a rien de spécial sur les colonnes/valeurs, c'est la recherche. Ils sont tous chaînes valides, et aucun n'est null/DBNull. Ce qui me manque ici? Je peux utiliser Select() comme une solution de contournement, évidemment, mais je voudrais savoir pourquoi Find() ne fonctionne pas.
Mise à JOUR: j'ai posté le xml à partir d'un sous-ensemble de ma table de recherche si quelqu'un veut donner à ceci un essai. Vous pouvez le télécharger à partir de: http://www.flantech.net/files/lkup_cat2.zip
Puis essayez d'exécuter ce code. C'est étrange, il va trouver la ligne à l'aide de différentes combinaisons de quatre colonnes, mais jamais avec les cinq colonnes.
DataTable dtLkupCat = new DataTable("lkup_cat");
dtLkupCat.ReadXml(@"lkup_cat2.xml");
//This is the row my search should find
DataRow goal = dtLkupCat.Rows[0];
//This is how I need to do the search, but it doesn't find the row
dtLkupCat.PrimaryKey = new DataColumn[] { dtLkupCat.Columns["sport"],
dtLkupCat.Columns["catcode"],
dtLkupCat.Columns["type"],
dtLkupCat.Columns["parent"],
dtLkupCat.Columns["code"]};
DataRow found = dtLkupCat.Rows.Find(new object[] { goal["sport"], goal["catcode"], goal["type"], goal["parent"], goal["code"] });
Debug.WriteLine((found == null ? "not " : "") + "found");
//Here I remove the "sport" column from the PK, and it finds the row
dtLkupCat.PrimaryKey = new DataColumn[] { dtLkupCat.Columns["catcode"],
dtLkupCat.Columns["type"],
dtLkupCat.Columns["parent"],
dtLkupCat.Columns["code"]};
found = dtLkupCat.Rows.Find(new object[] { goal["catcode"], goal["type"], goal["parent"], goal["code"] });
Debug.WriteLine((found == null ? "not " : "") + "found");
//Here I remove the "catcode" column from the PK, and it finds the row
dtLkupCat.PrimaryKey = new DataColumn[] { dtLkupCat.Columns["sport"],
dtLkupCat.Columns["type"],
dtLkupCat.Columns["parent"],
dtLkupCat.Columns["code"]};
found = dtLkupCat.Rows.Find(new object[] { goal["sport"], goal["type"], goal["parent"], goal["code"] });
Debug.WriteLine((found == null ? "not " : "") + "found");
//Here I remove the "type" column from the PK, and it finds the row
dtLkupCat.PrimaryKey = new DataColumn[] { dtLkupCat.Columns["sport"],
dtLkupCat.Columns["catcode"],
dtLkupCat.Columns["parent"],
dtLkupCat.Columns["code"]};
found = dtLkupCat.Rows.Find(new object[] { goal["sport"], goal["catcode"], goal["parent"], goal["code"] });
Debug.WriteLine((found == null ? "not " : "") + "found");
- Je ne sais pas la réponse, mais je vais faire quelques suppositions. Une possibilité est que les Colonnes ne sont pas bien définis. Peut-être que vous pourriez appeler
DataSet.FillSchema
ainsi. Une autre possibilité peut être il y a 2 lignes avec le même jeu de clés primaires. Essayez de vérifiertest.Length
. Vérifiez également si l'un de vosdtLkupCat.Columns["xyz"]
estnull
. - test.La longueur est de 1, et si il y avait des doublons ou des valeurs null dans les colonnes de clé une erreur sera générée lors de la définition de la PK.
Vous devez vous connecter pour publier un commentaire.
Essayez de modifier la dernière ligne à la suivante:
En supposant que vos valeurs sont toutes les chaînes
Par MS:
https://connect.microsoft.com/VisualStudio/feedback/details/694803/datatable-rows-find-fails-to-locate-row