【发布时间】:2019-01-02 05:58:01
【问题描述】:
我正在尝试使用 VBA 字典,并且:
- 如果新行不存在,则在数据库中插入新行
- 如果有,请更新该行
虽然我当前的代码适用于此,但对于我可能需要更新的数千条记录,它的运行速度非常慢,而且我在此站点上找到的其他解决方案并不能真正实现我所追求的。谁能帮我实现这一目标?到目前为止,我的代码如下:
Sub UpdateDatabase(dict As Object)
Dim Conn As Object, StrSQL As String, Rs As Object
Dim hmm As ADODB.Recordset
Set Conn = CreateObject("ADODB.Connection")
Conn.Provider = "Microsoft.ACE.OLEDB.12.0"
Conn.Open "C:\XXXX\cfrv2.accdb"
dictCount = dict.Count
counter = 0
For Each varKey In dict.Keys()
Application.StatusBar = Str(counter) & "/" & Str(dictCount)
counter = counter + 1
StrSQL = "SELECT * FROM `All SAMs Backlog` WHERE [LOCID] = '" & varKey & "'"
Set hmm = Conn.Execute(StrSQL)
If hmm.BOF And hmm.EOF Then
StrSQL = "INSERT INTO `ALL SAMs Backlog` ([SAM], [LOCID], [RTC Date], [CFR Status], [CFR Completed Date], [CFR On Hold Reason], [MDU], [ICWB Issue], [Obsolete]) VALUES (dict.Item(varKey)(0), '" & varKey & "', '20/12/2018', '" & dict.Item(varKey)(1) & "', '02/01/2019', '" & dict.Item(varKey)(2) & "' , '" & dict.Item(varKey)(3) & "' , '" &dict.Item(varKey)(4) & "' , '" & dict.Item(varKey)(5) & "')"
Conn.Execute (StrSQL)
Else
'Update the LOC in the table
StrSQL = "UPDATE `All SAMs Backlog` SET ([CFR Status] = '" & dict.Item(varKey)(1) & "', [CFR On Hold Reason] = '" & dict.Item(varKey)(2) & "', [MDU] = '" & dict.Item(varKey)(3) & "', [ICWB Issue] = '" & dict.Item(varKey)(4) & "', [Obsolete] = '" & dict.Item(varKey)(5) & "')"
Conn.Execute (StrSQL)
End If
Next
Conn.Close
End Sub
感谢任何帮助。
【问题讨论】:
-
根据您有多少插入与更新,您可以首先运行更新并检查“受影响的记录”值,然后如果该值为零,则运行插入。 stackoverflow.com/questions/12676747/…
-
我很惊讶代码可以正常工作。应该使用
[ ]来分隔表和字段名称,而不是撇号:[All SAMs Backlog]。如果 LocID 是公用键,你不能加入表吗?