【发布时间】:2011-09-28 20:46:10
【问题描述】:
我在 Access 2007 数据库中存储了一个查询。我在这台机器上安装了 Access 2010。我正在尝试执行以下操作:
- 将 Excel 电子表格导出为数据库中的临时表。
- 在临时表中添加一列并用文件名填充它
- 使用导出表的内容更新链接表。
更新是 Access 前端中存储的查询。当我从 Access 运行更新查询时,它工作正常。但是当我使用代码从 VBA 运行它时:
sub test()
filename=thisworkbook.name
Set db_fe = OpenDatabase("C:\Data\myDB.mdb")
If TableExists(db_fe, "tempCorrection") Then
DoCmd.RunSQL "drop table tempCorrection;"
End If
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, "tempCorrection", "C:\Data\corrections.xls", True
DoCmd.RunSQL "alter table tempCorrection add column newColumn text;"
DoCmd.RunSQL "update tempCorrection set newColumn='" & filename & "';", dbFailOnError
db_fe.Execute "updateCorrections", dbFailOnError
DoCmd.RunSQL "drop table tempCorrection;"
end sub
然后在“db_fe.execute”行上出现运行时错误“3078”:“Microsoft Access 数据库引擎找不到输入表或查询“tempCorrection”。确保它存在并且其名称拼写正确。”
查询 updateCorrections 如下所示:
UPDATE production AS p
INNER JOIN tempCorrection AS t
ON
(p.filename=t.filename)
AND
(p.a1=t.a1)
AND
(p.a2=t.a2)
set p.a3=t.a3
关于为什么我无法从 VBA 执行此查询有什么想法吗?
【问题讨论】:
-
您正在使用两个不同的连接来执行 SQL。使用 DoCmd.RunSQL 时,您使用的是 CurrentDB(当前在 Access 用户界面中打开的数据库),而当您使用 .Execute 时,您使用的是打开到数据库“C:\Data\myDB”的连接.mdb”。如果
DoCmd.RunSQL "drop table tempCorrection;"运行正确,这意味着表tempCorrection在当前打开的数据库中,而不是在另一个数据库中。这真的是草率的编码——你永远不应该把 DoCmd.RunSQL 和 .Execute 混在一起。事实上,你根本不应该使用 RunSQL……这太危险了。 -
@David-W-Fenton,好的,我将
.RunSQL更新查询替换为.Execute,并将.RunSQLALTER COLUMN 替换为.tabledefs然后.createField。我仍然收到此错误。我应该在下面的答案中发布我更改的代码吗? -
@David-W-Fenton,我已经把它贴在下面了。
-
听起来你可能需要刷新缓存。在 ADO 中,这涉及创建一个
JRO.JetEngine对象并使用连接对象调用其RefreshCache方法(例如,参见 this answer 中的 VBA)。不过,不知道如何使用 ye olde DAO 来做到这一点;) -
VBE 对象浏览器是你的朋友:
DBEngine.Idle dbRefreshCache