1

パイプ区切りのテキスト ファイルとデータベース テーブルに、主キー列を含む同じスキーマのデータがあります。

ファイルの各行がテーブルに存在するかどうかを確認する必要があります。存在しない場合は、その行の INSERT ステートメントを生成します。

テーブルには 30 列ありますが、ここではこの例のために単純化しました。

ID       Name    Address1    Address2    City    State    Zip

ID は実行中の ID 列です。insertそのため、ファイルの特定の ID 値がテーブルで見つかった場合、それに対して生成されるステートメントはありません。

ここに私の試みがありますが、これは正しくないと感じています:

 foreach (var item in RecipientsInFile)
        {
            if (!RecipientsInDB.Any(u => u.ID == item.ID ))
            {
               Console.WriteLine(GetInsertSql(item));
            }
        }
        Console.ReadLine();

編集:申し訳ありませんが、実際の質問をするのを逃しました。これを行う方法?大変お世話になりました。

編集: テーブルには 100 万以上の行があり、ファイルには 50K 行あります。これは 1 回限りのことであり、恒久的なプロジェクトではありません。

4

3 に答える 3

2

HashSetにすべての RecipientsInDB ID を追加し、セットにアイテム ID が含まれているかどうかをテストします。

 var recipientsInDBIds = new Hashset(RecipientsInDB.Select(u => u.ID));
 foreach (var item in RecipientsInFile)
    {
        if (!recipientsInDBIds.Contains(item.ID ))
        {
           Console.WriteLine(GetInsertSql(item));
        }
    }
    Console.ReadLine();
于 2013-03-20T15:21:36.597 に答える
2

を使用してIDリストを比較してみてください.Except()

List<int> dbIDs = Recipients.Select(x=>x.ID).ToList();
List<int> fileIDs = RecipientsFile.Select(x=>x.ID).ToList();
List<int> toBeInserted = fileIDs.Except(dbIDs).ToList();

toBeInserted.ForEach(x=>GetInsertSqlStatementForID(x));

コメントで私たちの間の衒学的で荒らしのために、上記のコード(インターウェブで見つけたソースコードと同様に)をコピーして本番コードに貼り付けないでください. このリファクタリングを試してください:

foreach (var item in RecipientsFile.Select(x=>x.ID)
                                   .Except(DatabaseRecipients.Select(x=>x.ID)))
{
   GetInsertSqlStatementForID(item);
}
于 2013-03-20T15:19:53.987 に答える
0

Lots of ways of accomplishing this. Yours is one way.

Another would be to always generate SQL, but generate it in the following manner:

if not exists (select 1 from Recipients where ID == 1234)
    insert Recipients (...) values (...)
if not exists (select 1 from Recipients where ID == 1235)
    insert Recipients (...) values (...)

Another would be to retrieve the entire contents of the database into memory beforehand, loading the database IDs into a HashSet, then only checking that HashSet to see if it exists - would take a little longer to get started, but would be faster for each record.

Any of these three techniques would work - it all depends on how big your database table is, and how big your file is. If they're both relatively small (maybe 10,000 records or so), then any of these should work fine.

EDIT

And there's always option D: Insert all records from the file into a temporary table (could be a real table or a SQL temp table, doesn't really matter) in the database, then use SQL to join the two tables together and retrieve the differences (using not exists or in or whatever technique you want), and insert the missing records that way.

于 2013-03-20T15:20:53.687 に答える