使用Linq到Sql的批量插入(vb.net)

时间:2014-09-18 12:24:46

标签: sql vb.net linq bulkinsert

我尝试使用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?

提前感谢您的回复,

格特

1 个答案:

答案 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之前)可能有助于提高性能。