我尝试使用Linq to Sql批量插入我的sql表。 我仍然处于linq的学习中,所以请保持温和。
代码不是问题,因为一切都输入很好,但是过程非常慢:每条记录4秒,而我有大约15k的记录。
问题的主要核心(我认为)是在我想添加记录之前,我首先要检查这条记录是否已经存在,以确保我没有重复。 所以这意味着我搜索已经存在的15k记录数据库,并在找到记录时发送真/假响应。
Dim expr = From spare In db.tblSpareParts Where spare.SparePartDeleted = False Select spare
For Each part In expr
If part.SparePartYnumber = ynumber Then
Return True
End If
Next
Return False
主代码,我们遍历访问文档。
For Each Me.dr In dt.Rows
If dr.Item(0).ToString <> "" Then
blnfoundit = db.getynumberinfo(dr.Item(0).ToString)
If blnfoundit Then
db.setSparePart("Toevoegen", dr.Item(0).ToString, dr.Item(1).ToString, "", "", "Mat Ref: " & dr.Item(2).ToString & " - Vendor : " & dr.Item(5).ToString, 0, 0, CInt(IIf(dr.Item(12).ToString = "", 0, dr.Item(12).ToString)))
End If
End If
Next
最后将一段代码放在SQL中:
Dim sqlimport As New tblSparePart
With sqlimport
.SparePartCurrentStock = currentstock
.SparePartDeleted = False
.SparePartDescription = description
.SparePartLastModified = DateTime.Now()
.SparePartLocation = location
.SparePartMinimumStock = minimumstock
.SparePartPrice = price
.SparePartRemarks = remarks
.SparePartType = type
.SparePartUserName = General.username
.SparePartYnumber = ynumber
End With
db.tblSpareParts.InsertOnSubmit(sqlimport)
db.SubmitChanges()
关于如何加快这一过程的任何想法?
顺便说一下,我确实在网上搜索过类似的东西,并发现了一些关于SqlBulkCopy的内容,但我不知道如何使用它,以及它是否有用。 I have a Tags Table. How to Bulk Insert using LINQ?
提前感谢您的回复,
格特
答案 0 :(得分:1)
如果这样就像LINQ to Entities一样,这里的缓慢实际上是为每条记录创建更改跟踪对象。
在这种情况下,您可以使用DbContext.Configuration.AutoDetectChangesEnabled =
False
来停用更改跟踪。延迟更改检测,直到循环完成并处理整个上下文。
有关EF方面的更多信息,请参阅此文章: DbContext AutoDetectChangesEnabled set to false detecting changes
至于LINQ to SQL的问题,您可以查看本文中概述的DataContext.ObjectTrackingEnabled
属性:
http://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.objecttrackingenabled(v=vs.90).aspx
也许在循环之前将此属性设置为false并在之后返回true(但在SubmitChanges之前)可能有助于提高性能。