0

TableA のスキーマが TableB とは異なる TableB にない TableA からすべての行を取得する方法 (それらは異なる dbms から来る異なる型指定された DataTable クラスです)?

ここに画像の説明を入力 ここに画像の説明を入力

countryas にcountry_idないすべての行が必要CountryですidCountry

src.countryこれらは異なるスキーマを持っているため (そしてdest.Country異なる DataTable-classes であるため) 、これは機能しません。

Dim srcNotInDest = src.country.Except(dest.Country)

srcdest強い型指定された DataSetです

注:必ずしもVB.NETであるとは限りません

2 番目のパラメーターとして指定する必要があるとIEqualityComparer思いますが、方法がわかりません。おそらく、新しい行を識別するための別の(より高速な)アプローチがあります。

背景:

MySQL データベースから SQL-Server データベースにテーブルをインポートしています。主キーのみをチェックし、行の内容を比較しないことで十分です。この例のテーブルには数行しか含まれていませんが、2 つのテーブルには約 100000 行が含まれているため、ソースと宛先の同期ではパフォーマンスが重要になります。

4

1 に答える 1

1

それらが異なるデータベースである場合、IDを個別に取得し、たとえば(C#構文で)メモリ内で比較する必要があると思います

    var t1 = (from r in src.country  select r.country_id).ToList();
    var t2 = (from r in dest.Country select r.idCountry).ToList();

    var missing = t1.Except(t2);

ソースの同期に関するパフォーマンスの問題

これが 1 回限りの移行プロセスである場合、このルーチンに数秒かかるとしても、おそらく許容できるでしょう。しかし、あなたは「同期」について言及しているので、これは1回限りではないと想定しているため、これが許容されるかどうかは、実行される頻度によって異なります。

私のマシンで 1 つのテーブルで 200,000 を読み取り、別のテーブルで 100,000 (確かに同じ SQL データベース内) を読み取り、それらを比較する簡単なテストには 0.4 秒かかります。もちろん、考慮すべき要素は他にもあります。たとえば、SQL サーバーにかかる負荷などです。

于 2011-07-16T10:13:10.207 に答える