【问题标题】:Error 80004005 when executing query in ADODB (VBA, Excel and Access 2010)在 ADODB(VBA、Excel 和 Access 2010)中执行查询时出现错误 80004005
【发布时间】:2013-03-28 01:05:10
【问题描述】:

我有一个无法解决的问题。我有一个 Access 数据库,我正在尝试使用 ADODB 在 Excel 中使用 VBA 创建一组查询。

我有几个成功创建的查询,即。下面的一个。然而,第二个将不起作用。如果我将查询手动复制到访问数据库(从 SELECT 并转发)并保存为“DK_Teledata_1”,它就完美了

CREATE PROCEDURE DK_Aktiviteter_Union_1 AS SELECT DK_Aktivitet.År FROM DK_Aktivitet;

还有一个不起作用的

CREATE PROCEDURE DK_Teledata_1 AS SELECT DK_Teledata.Dato FROM DK_Teledata INNER JOIN Time_Intervals ON DK_Teledata.Interval = Time_Intervals.Time_Interval;

创建以下具有相同数据的查询没有任何问题:

CREATE PROCEDURE DK_Teledata_1 AS SELECT * FROM DK_Teledata;
CREATE PROCEDURE DK_Teledata_1 AS SELECT * FROM Time_Intervals;
CREATE PROCEDURE DK_Teledata_1 AS SELECT * FROM Time_Intervals, DK_Teledata;

一旦我创建连接或使用“WHERE DK_Teledata.Interval = Time_Intervals.Time_Interval”,它就会失败。

Intervals 和 Time_Intervals 字段都是 Text 字段,具有相同的长度和属性。

使用 Excel 2010、accdb 数据库文件和“Microsoft.ACE.OLEDB.12.0”提供程序字符串。

【问题讨论】:

    标签: excel vba ms-access inner-join adodb


    【解决方案1】:

    作为一个疯狂的猜测,我建议你用CREATE VIEW 代替CREATE PROCEDURE。

    如果这也不起作用,您可以使用 DAO 创建查询。

    Dim strSql As String
    Dim db As DAO.Database
    Dim qdf As DAO.QueryDef
    
    strSql = "SELECT DK_Teledata.Dato" & vbCrLf & _
        "FROM DK_Teledata INNER JOIN Time_Intervals" & vbCrLf & _
        "ON DK_Teledata.Interval = Time_Intervals.Time_Interval;"
    Set db = OpenDatabase("C:\db_folder\your.accdb", True, False)
    Set qdf = db.CreateQueryDef("DK_Teledata_1", strSql)
    

    该代码使用早期绑定,因此需要设置引用。但是您可以使用不需要引用的后期绑定来做同样的事情。

    Dim strSql As String
    Dim dbe As Object
    Dim db As Object
    Dim qdf As Object
    
    strSql = "SELECT DK_Teledata.Dato" & vbCrLf & _
        "FROM DK_Teledata INNER JOIN Time_Intervals" & vbCrLf & _
        "ON DK_Teledata.Interval = Time_Intervals.Time_Interval;"
    Set dbe = CreateObject("DAO.DBEngine.120")
    Set db = dbe.OpenDatabase("C:\db_folder\your.accdb", True, False)
    Set qdf = db.CreateQueryDef("DK_Teledata_1", strSql)
    

    【讨论】:

    • 我仍然没有找到adodb连接不起作用的原因。但是在将连接更改为 DAO 连接后,它就完成了工作!非常感谢您的帮助
    • 原因:Access 数据库在 Jet 上运行,而不是您习惯的 ANSI 标准 SQL,并且 Jet SQL 中没有“CREATE VIEW”和“PROCEDURE”——DAO 和 ADODB 都没有将在无法读取它们的数据库引擎上运行 SQL 语句。 @HansUp 的答案有效,因为 DAO 对象 正在从 Access 数据库实例化的 Database 对象上运行“CreateQueryDef”方法:您完全绕过了 SQL。同时,80004005 是默认的 COM 对象错误:这意味着编写 ADODB 对象的开发人员没有费心将这些内容写入信息性错误消息中
    • @Nile CREATE VIEW 和 CREATE PROCEDURE 在 ADO/OleDb 下均受支持。事实上,马丁报告了几个有效的CREATE PROCEDURE 声明。
    • @HansUp - ADO 支持数据库引擎及其 SQL 方言支持的任何内容:而 JET SQL 不支持 CREATE VIEW 和 CREATE PROCEDURE - 但是,这似乎不是全部故事:我有来自另一个来源的报告,最新版本的 OLEDB 驱动程序 (Microsoft.ACE.OLEDB.12.0) 确实会运行这些命令:驱动程序似乎正在解析或翻译 SQL 并提供一个 '为 Jet 数据库引擎创建 querydef' 命令(或未记录的 Jet-SQL 关键字)。这不适用于仍在使用 JET OLEDB 4.0 驱动程序的用户。
    猜你喜欢
    • 2017-03-21
    • 2019-10-10
    • 2022-11-22
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    相关资源
    最近更新 更多