访问 VBA:Scripting.Dictionary - 转储到表?

Posted

技术标签:

【中文标题】访问 VBA:Scripting.Dictionary - 转储到表?【英文标题】:Access VBA: Scripting.Dictionary - Dump to Table? 【发布时间】:2016-09-14 13:28:06 【问题描述】:

感谢前面提供的帮助,我有了一种计算记录集中字符串之间词频的实用方法。以下代码会产生所需的结果。

最后一步是将字典结构转储到 currentDB 中的 Access 表中。我可以通过下面注释的每个键单步执行并通过 SQL 附加到表中 - 但使用 24K 术语非常慢。

已更新 >> 带解决方案

Private Sub Command0_Click()

Dim counts As New Scripting.Dictionary
Dim word As Variant
Dim desc As String

Dim rs1 As DAO.Recordset
Dim rs2 As DAO.Recordset  '<< solution
Dim strSQL As String
Dim db As Database

Set db = CurrentDb

strSQL = "SELECT DISTINCT Items.Description FROM Items ;"

Set rs1 = db.OpenRecordset(strSQL, dbOpenDynaset)

Do While Not rs1.EOF
    For Each word In Split(rs1!Description, " ")
        If Not counts.Exists(word) Then
            counts.Add word, 1
        Else
            counts.Item(word) = counts.Item(word) + 1
        End If
    Next
    rs1.MoveNext
Loop

'>> .AddNew Solution inserted as suggested below <<

rs2 = db.OpenRecordset("Freq", dbOpenTable)  

For Each word In counts.Keys
    With rs2
       .AddNew             ' Add new record
       .Fields!Term = word
       .Fields!Freq = counts(word)
       .Update
       .Bookmark = .LastModified
    End With
Next

rs2.Close

'>> End Solution <<

Set rs1 = Nothing
Set rs2 = Nothing

MsgBox "Done"

End Sub

问题:

    我可以将字典转储到 BULK 的表中,而不是逐个逐个遍历键吗?

基本原理:(对我而言)使用表格结构更容易执行下游表示和操作。

谢谢!

【问题讨论】:

没有循环真的没有办法做到这一点。即使在 .NET 中,您从 Dictionary 中获得的最接近的是键/值对数组。 DAO 连接应该通过 INSERT 循环提供良好的性能。 为什么不直接将其添加到表中,而不是先写入字典。然后你可以用计数对数据进行分组。 【参考方案1】:

您的代码没有显示您如何尝试插入行 - 我假设每行都有单独的 INSERT INTO (...) VALUES (...) 语句?

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

看到这个答案:https://***.com/a/33025620/3820271

这里举个例子:https://***.com/a/36842264/3820271

【讨论】:

Andre, 17K ".AddNew" 按照您的建议插入 @MarkPelletier:您可以通过删除 .Bookmark = .LastModified 来减少更多毫秒 - 只有当您想从新添加的记录中读取数据时才需要这样做,例如自动编号主键。

以上是关于访问 VBA:Scripting.Dictionary - 转储到表?的主要内容,如果未能解决你的问题,请参考以下文章

尝试通过 VBA 访问 Lync 时在 Excel VBA 编辑器中使用的参考

微软访问vba-将焦点从访问word转移

访问 VBA 是不是有 Listbox.List 方法,因为 excel VBA 有

通过 vba 访问更改导航窗格组

从访问 VBA 调用 Javascript 函数

从 VBA 访问串行端口的最佳方法是啥?