【发布时间】:2020-07-13 21:55:31
【问题描述】:
我以前的标题在那里引起了一些混乱...更新 我最近在使用一些 VBA 连接 Excel 和 Access 时遇到了这个问题。
所以我有一个电子表格,其中包含一个需要导入 Access 数据库的表。 该表是通用的,如下所示。
EmployeeNumber Unused_Field2 Unused_Field3
1 @@@ @@@
2 @@@ @@@
3 @@@ @@@
Access 中的唯一键设置为 EmployeeNumber。
我在 Excel 中的 VBA 代码如下所示:
Sub test()
Dim con As ADODB.Connection
Dim rst As ADODB.Recordset
strcon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\temp\mydb.mdb;"
strsql = "SELECT * FROM Table1"
Set con = New Connection
Set rst = New Recordset
con.Open strcon
rst.Open strsql, strcon, adOpenStatic, adLockOptimistic
For i = 0 To n
On Error GoTo Errhdl
rst.AddNew Array("Field1", "Field2", "Field3"), Array(Range("A" & i), Range("B" & i), Range("C" & i))
On Error GoTo 0
Next
Exit Sub
Errhdl:
Debug.Print "Record" & i & "caused an error"
Resume Next
End Sub
不幸的是,数据质量不高,我经常会有重复的值导致密钥违规。 虽然我虽然 Resume Next 将清除允许另一个“AddNew”运行的错误,但它没有。 一个键违规后的所有后续条目都将返回相同的错误。
所以我的问题如下:
- 是否可以清除与记录集相关的错误? (作为记录,我试图获取“错误集合”并使用 方法 Errors.Clear。那没有成功。错误集合是特定于 ADO 对象的属性 - MSDN Errors Collection)
- 可以在不关闭并重新打开记录集的情况下完成此操作吗?
如果需要更多说明,请告诉我!
【问题讨论】:
-
我会先将您的标签重命名为
Err以外的名称,这已经是 VBA 中的一个对象。 -
你不能用
Command代替Recordset来做INSERTs吗? -
@shahkalpesh 是的,command.execute 方法可以与 resumenext 一起使用,但是与记录集相比,它提供的控制更少。另外,这意味着我需要一个字符串构造函数来构造 SQL 语句,该语句有时容易出错,尤其是在使用不同的数据类型和特殊字符时。 (反正这是我的看法)
-
@DerekCheng:不。我认为这不容易出错。
Command与Parameters集合一起使用是一种简单、无错误的方法,无需进行字符串连接。 Here 就是一个例子。 -
+1 是的,参数(一如既往)让构建 sql 变得痛苦。