我正在用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语句插入列表中的每个对象会不会更好?
提前谢谢。
发布于 2013-01-30 05:28:09
您担心性能问题,同时使用Linq-2-sql进行批量插入/更新。这是不太一致的,因为linq-2-sql不适合批处理操作(至少如果您需要它们是快速的)。
别被InsertAllOnSumbit骗了.Linq-2-sql将为每个插入创建单独的insert语句。这本身就已经很慢了。
在临时表中批量插入数据集are /Two/Three要好得多。使用SqlBulkCopy),然后使用merge语句移动到目标表。
https://stackoverflow.com/questions/14573486
复制相似问题