MS Access插入缓慢的大型记录集(VBA)

时间:2016-04-25 11:47:41

标签: sql vba ms-access

我有一段代码创建一个新表,然后尝试将记录集值复制到表中。唯一的问题是它非常慢并且访问在下面执行此插入部分时显示加载符号。目前这个问题正在插入500条记录,但是当我得到最终数据集时,我需要插入大约10,000到20,000。

[{"linkId":"changeDriveLink","url":"/drive
    /3696434","zoneId":"forceAjax"},{"linkId":"printProductsFormSubst","url":"/drive/rayon.pagetemplate.substitutionlist.printproductsformsubst","zoneId":"forc

我想知道的是,有什么方法可以加快速度吗?还是有更好的方法? (我要做的是在运行时使用RecordSet中的一组唯一字段创建一个表,并添加一个额外的列,其中一个布尔值存储在每个Record的Match数组中)。创建工作正常,但上面的插入代码非常慢。

2 个答案:

答案 0 :(得分:1)

是的,使用DAO。快得多。此示例复制到同一个表,但您可以轻松修改它,以便在两个表之间进行复制:

Public Sub CopyRecords()

  Dim rstSource   As DAO.Recordset
  Dim rstInsert   As DAO.Recordset
  Dim fld         As DAO.Field
  Dim strSQL      As String
  Dim lngLoop     As Long
  Dim lngCount    As Long

  strSQL = "SELECT * FROM tblStatus WHERE Location = '" & _
                "DEFx" & "' Order by Total"

  Set rstInsert = CurrentDb.OpenRecordset(strSQL)
  Set rstSource = rstInsert.Clone
  With rstSource
    lngCount = .RecordCount
    For lngLoop = 1 To lngCount
      With rstInsert
        .AddNew
          For Each fld In rstSource.Fields
            With fld
              If .Attributes And dbAutoIncrField Then
                ' Skip Autonumber or GUID field.
              ElseIf .Name = "Total" Then
                ' Insert default value.
                rstInsert.Fields(.Name).Value = 0
              ElseIf .Name = "PROCESSED_IND" Then
                rstInsert.Fields(.Name).Value = vbNullString
              Else
                ' Copy field content.
                rstInsert.Fields(.Name).Value = .Value
              End If
            End With
          Next
        .Update
      End With
      .MoveNext
    Next
    rstInsert.Close
    .Close
  End With

  Set rstInsert = Nothing
  Set rstSource = Nothing

End Sub

答案 1 :(得分:0)

对于循环中的多个插入,请不要使用SQL INSERT语句。而是使用DAO.Recordset.AddNew

请参阅此答案:https://stackoverflow.com/a/33025620/3820271

作为积极的副作用,您的代码将变得更易读,并且您不必处理不同数据类型的多种格式。

For Each field In RecordSet1.Fields
     rsTarget(field.Name) = field.Value
Next field