DAO .Execute方法在Access mde中失败

时间:2010-02-19 20:51:02

标签: ms-access dao

首先,我正在使用Access 2000和DAO。我有代码执行一个简单的INSERT INTO查询,我使用db.Execute调用。此代码在mdb中正常工作。但是,如果我编译成mde,那么我得到

  

错误5 - 无效的过程调用或参数

此行上的

并且未插入记录。但是,如果我使用完全相同的SQL语句从db.Execute更改为DoCmd.RunSQL,则插入记录时没有任何问题。有没有人知道为什么DAO数据库对象的DAO Execute方法在编译成MDE后会突然停止工作?

注意:如果我指定.Execute方法的dbFailOnError选项,我只会收到错误。如果我关闭该选项,则不会出现错误,但仍未插入记录。

编辑:
此行在MDE中失败(但在MDB 中正常工作):

App.db.Execute InsertSQL, dbFailOnError

在上面的代码行中有一个断点的即时窗口:

?InsertSQL
INSERT INTO Changes
(PropertyID, FieldID, [Which], [When], [Before], Reason, ReportChange)
VALUES (1, 2, "M", #2/19/2010 4:51:44 PM#, "Suite 2; 430 W KING ST; ABBOTTSTOWN, PA 17301-9771", "Per Owner", True)

(我有一个专门用于构建和执行SQL语句的完整类模块,所以准确显示我是如何构建InsertSQL字符串变量并不真实。但是,我真的不认为这是相关的。)

这条线无处不在:

DoCmd.RunSQL InsertSQL

编辑:App.db定义(注意我的项目中没有对ADO的引用,只有DAO):

Public App As New clsApp

clsApp类模块(仅限相关行):

Private m_objDB As Database

Public Property Get db() As Database
    Set db = m_objDB
End Property

Private Sub Class_Initialize()
    Set m_objDB = CurrentDb
End Sub

Private Sub Class_Terminate()
    Set m_objDB = Nothing
End Sub

如果你很好奇,我使用App.db而不是CurrentDB有两个主要原因:1)通过不必重复调用CurrentDB函数(调用一次然后只引用它返回的对象)和2来获得轻微的性能提升).RecordsAffected等数据库对象的属性总是返回相关信息。另外,打字速度更快。我是一名程序员,所以我天生懒惰。

编辑:首先,请允许我向那些一直关注此主题并试图帮助我的人道歉。看来我可能遗漏了问题的关键细节。 App.db.Execute调用发生在类模块(clsSQL)中,它引用名为App的全局变量,它本身就是不同类模块(clsApp)的实例。我猜测问题是我在另一个类模块中引用了一个类模块的实例。任何人都可以确认从另一个类中调用一个类模块是否是MDB而不是MDE支持的东西? [这不是问题。我过分思考这个问题。请参阅我的答案。]

3 个答案:

答案 0 :(得分:0)

您可能正在传递给Execute语句的字符串中使用表单控件引用。那就是我!ControlName在引号内。改变它,使它超出报价。那就是改变“....选择我!ControlName As Field1,Field2,Field3 ......”改为“.... SELECT”&我!ControlName& “如Field1,Field2,Field3 ......”

因此VBA可以正确转换控件名称的值。 Docmd.RunSQL为您完成此任务。执行没有。

答案 1 :(得分:0)

首先,我真诚地向那些试图帮助我的人道歉。当我发现其他人提出问题时我感到非常沮丧,我遗漏了关键信息,因为我不认为这是相关的。这是我的clsApp类模块的完整初始化过程:

Private Sub Class_Initialize()
    Application.Echo True
    m_bEcho = True

    Set m_objDB = CurrentDb
    m_sUser = GetUserName
    Set m_objStatus = New clsStatus
    m_sPgmName = Application.CurrentProject.Name
    m_sPgmName = Left(m_sPgmName, InStr(m_sPgmName, ".mdb") - 1)
End Sub

关键是最后一行。当我编译成“.mde”时,CurrentProject.Name中不再出现字符串“.mdb”。因此,对InStr()的调用返回0.并0 - 1 = -1。所以我传递一个负数作为Left()函数的Length参数。但是,长度参数不能为负数。它绝对是“无效的过程调用或参数。”

我的简单修复方法是从“.mdb”中删除“mdb”,然后检查“。”的位置。这也适用于“.accdb”和“.accde”2007扩展。

再次,我道歉。

答案 2 :(得分:-1)

您的参考资料中有哪些版本的DAO?可能是旧版本在mdb上正常工作但在mde上失败。尝试将其设置为最新版本并再次编译