【问题标题】:Bulk Insert with Linq to Sql (vb.net)使用 Linq 批量插入到 Sql (vb.net)
【发布时间】:2014-09-18 12:24:46
【问题描述】:

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

提前感谢您的回复,

格特

【问题讨论】:

    标签: sql vb.net linq bulkinsert


    【解决方案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 并在之后(但在 SubmitChanges 之前)设置回 true 可能有助于提高性能。

    【讨论】:

    • 感谢您的回复。我的更新已经进行到一半了,所以我先让更新完成。明天我会看看你的建议是否可以解决问题。
    猜你喜欢
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    相关资源
    最近更新 更多