2009-06-25 12 views
0

今日の私のコードでの問題は奇妙なことです。まだ再現できませんでした。私は(デザイナーで作成された)型付きのデータセットで作業しています。データテーブル内のすべての行をループしています。DataSet:列挙子とFindByIdが等価のDataRowを返さない

時には(!)、主キーを使用して検索すると、返された行は列挙子のものと等しくなりません。 FindByIdはいつも本当に論理的である同じ行を、返すため

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

ないラインは、コンソールに書き込まれます。これは私が問題を再現するために書いたいくつかのコードです。 (!常に同じ行)私のプロジェクトのコードでは、いくつかの文字列の列を持つ類似したデータセットで、行の約3%で、それはしていませんし、文字列フィールドの一つがちょうど空である:

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

主キーは唯一の主キーフィールドであるため、FindByIdは生成されたメソッドです。誰かが少しヒントを知っているのですか、以前に同じ問題を経験しましたか?私はこのバグや機能を可能にする非常に特殊なケースだと恐れています。 :)

これは、列挙によって行われたキャストによって生成される可能性について考えました。列挙子は、生成された型付き行の基本型DataRowで動作します。しかし、私は...そこ

乾杯 マティアス

答えて

2

を間違った何かを見つけられませんでしたあなたの主キーの種類は何ですか? DataSetはGuids(と他の値も)を比較する微妙なバグを持っています。 Guidエラーは、特定のGuid値と関係があり、通常は正常に動作します。

注:私はバグを持っていると言うとき、私はバグレポートが受理されましたが、それは同様

+0

ありがとう修正をされている場合、私は知らないことを知っている意味します!型は文字列ですが、実際にはフィールドにGUIDが格納されています。これは与えられた、私は変更することはできません。 –

+0

エラーを提出したときに私が提案した回避策(誤っていない場合は約3年前)は、SQLを使用してGUIDを文字列に変換することでした。残念ながら、SQLのパフォーマンスに非常に大きな影響を与えます。あなたがそれを行うことができない場合は、(少なくともデバッグ用に)辞書を主キーとし、その値を行とする辞書をテーブルに変換します。私の知る限り、問題はGetHashKeyに関連していなかった –

関連する問題