Набор данных:Enumerator и findById не возвращают одинаковые DataRow
-
20-08-2019 - |
Вопрос
Сегодняшняя проблема в моем коде довольно странная, и я пока не смог ее воспроизвести.Я работаю с типизированным набором данных (созданным с помощью дизайнера) и перебираю все строки в datatable.
Иногда (!) при поиске по первичному ключу возвращаемая строка не равна строке из перечислителя.Это некоторый код, который я написал, чтобы воспроизвести проблему:
foreach(DataSet1.DataTable1Row dr in ds.DataTable1)
{
if(ds.DataTable1.FindById(dr.Id) != dr)
Console.Write(dr.Id);
}
Ни одна строка не будет записана в консоль, потому что findById всегда возвращает одну и ту же строку, что действительно логично.В коде моего проекта с аналогичным набором данных с несколькими строковыми столбцами примерно в 3% строк (всегда одних и тех же строк!) этого не происходит, и одно из строковых полей просто пустое:
ds.DataTable1.FindById(dr.Id) != dr // returns false, for whatever reason
Первичный ключ - это единственное поле первичного ключа, и для этого findById является сгенерированным методом.Кто-нибудь знает небольшой намек или сталкивался с такой же проблемой раньше?Боюсь, это очень, очень особый случай, который я создал, чтобы включить эту ошибку или функцию.:)
Я подумал о возможности того, что это может быть произведено приведением, выполняемым перечислением.Перечислитель действительно работает с DataRow
базовый тип сгенерированных типизированных строк.Но я не нашел там ничего плохого...
Ваше здоровье Matthias
Решение
Каков тип вашего первичного ключа?в наборе данных есть небольшая ошибка при сравнении идентификаторов Guid (и, возможно, других значений).Ошибка Guid имеет отношение только к определенным значениям Guid и обычно работает хорошо.
примечание:Когда я говорю "есть ошибка", я имею в виду, что я знаю, что сообщение об ошибке было принято, но я не знаю, было ли это исправлено