2

C#.NET 3.5でLINQ-To-SQLを使用してデータベースを更新していますが、使用しているデータが常に適切であるとは限りません。挿入されたデータとデータベースから重複が発生する可能性が高くなります。

現在、私はこれを使用しています。ここで、、dataSetOneおよびdataSetTwodataSetThree更新するモデルのリストです。

AppDataContext db = new AppDataContext();

db.DatasetOne.InsertAllOnSubmit(dataSetOne);
db.DatasetTwo.InsertAllOnSubmit(dataSetTwo);
db.DatasetThree.InsertAllOnSubmit(dataSetThree);

try
{
    db.SubmitChanges(ConflictMode.ContinueOnConflict);
}

catch (Exception e)
{
    CsvToImsConverter.Log.Error(e.Message);

    foreach (ObjectChangeConflict occ in db.ChangeConflicts)
    {
        MetaTable metatable = db.Mapping.GetTable(occ.Object.GetType());
        Console.WriteLine("Error in Table: {0}", metatable.TableName);
    }
}

そして、これはうまくいきます。私が抱えている問題は、重複がある場合、プログラムが更新されず、主キー違反がスローされることです。主キー違反のない値を挿入し、違反のない値を更新したいと思います。

データベースで重複を検索することはできますが、データベースには数千のレコードがあり、挿入しようとしているのは数百であるため、非常にコストがかかる可能性があります。主キー違反エラーをキャッチし、このレコードを更新して続行する方法はありますか?重複が多くないため、これははるかに優れたソリューションになります。LINQ-To-SQLの使用は必須ではありません。

ループを使用して、ステートメントを使用foreachしてリスト内の各オブジェクトを挿入する方がよいでしょうか?catch

前もって感謝します。

4

1 に答える 1

1

パフォーマンスが心配であると同時に、バッチ挿入/更新に Linq-2-sql を使用しています。linq-2-sql はバッチ操作には適していないため、これはあまり一貫性がありません (少なくとも高速にする必要がある場合はそうではありません)。

InsertAllOnSumbit にだまされないでください... Linq-2-sql は、挿入ごとに個別の挿入ステートメントを作成します。これ自体はすでに非常に遅いです。

データセットワン/ツー/スリーをステージング テーブルに一括挿入し (SqlBulkCopy を使用して eq)、その後、マージ ステートメントを使用してターゲット テーブルに移動する方がはるかに優れています。

于 2013-01-29T21:28:09.473 に答える