簡體   English   中英

Linq-To-Sql批處理重復復制

[英]Linq-To-Sql Batch Updating with Duplicates

我正在C#.NET 3.5中使用LINQ-To-SQL更新數據庫,但是我使用的數據並不總是很好。 很可能插入的數據和數據庫中有重復項。

目前,我正在使用它,其中dataSetOnedataSetTwodataSetThree是要更新的模型的列表:

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語句將列表中的每個對象插入嗎?

提前致謝。

您擔心性能,同時又將Linq-2-sql用於批處理插入/更新。 這不是很一致,因為linq-2-sql不適合批處理操作(至少如果您需要快速處理,則不適合)。

不要被InsertAllOnSumbit所欺騙... Linq-2-sql將為每個插入創建一個單獨的插入語句。 這本身已經很慢。

您最好將數據集One / Two / Three插入到臨時表中(使用SqlBulkCopy使用eqBu),然后再使用merge語句移至目標表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM