2

我有一个 VBA 程序(在表单后面),它执行以下操作;-

  • 将 XML 文件中的数据导入一个空的临时表(带有一个名为 ID 的关键字段)
  • 根据临时表中的查询创建电子表格
  • 通过追加查询将数据追加到备份表中(备份表与临时表具有相同的表格式,即称为ID的关键字段)
  • 从 temp 中删除所有内容,为下一次运行做好准备

从 XML 导入数据后,我希望能够捕捉到同一文件尝试导入两次的场景(即临时表包含备份表中也存在的 ID),通过 msgbox 告诉用户,然后退出 Sub。

我原以为可以在尝试追加时通过错误代码处理来做到这一点,捕获有关重复键的错误。

我有一个附加查询要附加到备份中,如果我通过查询本身运行此查询,我会收到有关存在重复项的警告等,可选择是否继续运行查询。

但是,我通过 OpenQuery 在 VBA 中执行此操作(并且已关闭警告),所以什么也没发生?我似乎无法捕获错误代码。

我尝试编写一个选择查询来识别任何重复的 ID,然后以某种方式检测该查询是否返回任何行,但也无法使其工作,因为无法找到一种方法来检测查询是否返回任何行。

4

1 回答 1

1

“我通过 OpenQuery 在 VBA 中执行此操作(并关闭了警告),所以什么也没发生?我似乎无法捕获错误代码。”

关闭SetWarnings通常会抑制信息,这就是您预期的错误消息不会出现的原因。许多经验丰富的 Access 开发人员建议SetWarnings关闭是一个坏主意。请参阅此 SO 问题,了解另一个示例,说明关闭时故障排除会多么令人沮丧SetWarnings

由于您有一个“追加查询”,因此请使用DAO.Database .Execute方法而不是使用OpenQuery.

Dim db As DAO.Database
Dim strInsert As String
strInsert = "INSERT INTO backup_table(ID, fld1, fld2)" & vbCrLf & _
    "SELECT ID, fld1, fld2 FROM temp_table"
Set db = CurrentDb
db.Execute strInsert, dbFailOnError

使用SetWarningson ( ) 当备份表已经包含您尝试添加的值True时,该方法将由于键冲突而触发错误消息。ID

另外,如果您想要计算重复项,则此查询应为您提供。

SELECT Count(*) AS count_of_duplicates
FROM
    temp_table AS t
    INNER JOIN backup_table AS b
    ON t.ID = b.ID

如果您想在 中插入不重复的temp_tablebackup_table,请尝试这样的查询...

INSERT INTO backup_table(ID, fld1, fld2)
SELECT t.ID, t.fld1, t.fld2
FROM
    temp_table AS t
    LEFT JOIN backup_table AS b
    ON t.ID = b.ID
WHERE b.ID Is Null
于 2013-07-02T16:52:46.623 回答