[英]Linq-To-Sql Batch Updating with Duplicates
我正在C#.NET 3.5中使用LINQ-To-SQL更新數據庫,但是我使用的數據並不總是很好。 很可能插入的數據和數據庫中有重復項。
目前,我正在使用它,其中dataSetOne
, dataSetTwo
和dataSetThree
是要更新的模型的列表:
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.