首先,我使用Access 2000和DAO。我有代码执行简单的INSERT查询,我使用db.Execute调用该查询。此代码在mdb内部运行良好。但是,如果我编译成mde,那么我将
错误5-无效的过程调用或参数
在这一行中,记录不会被插入。但是,如果我使用完全相同的SQL语句从db.Execute更改为DoCmd.RunSQL,则插入记录时不会出现任何问题。有人知道为什么DAO数据库对象的DAO执行方法一旦编译成MDE就会突然停止工作吗?
注意:只有当我指定了dbFailOnError方法的.Execute选项时,我才会得到错误。如果关闭该选项,则不会出现错误,但记录仍未插入。
编辑:
此行在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)(我有一个完整的类模块,专门用于构建和执行InsertSQL语句,因此确切地显示我是如何构建字符串变量是不实际的。然而,我真的不认为这是相关的。)
这条线在任何地方都起作用:
DoCmd.RunSQL InsertSQL编辑: App.db定义(注意我的项目中没有引用ADO,只有DAO):
Public App As New clsAppclsApp类模块(仅相关行):
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而不是MDEs支持的吗?这不是一个问题。我想的太多了。请看我对整个故事的回答。
发布于 2010-02-19 21:18:44
您可能在传递给Execute语句的字符串中使用窗体控件引用。就是我!ControlName在引号里。改变它,使它在引号之外。“.选择我!ControlName作为Field1,Field2,Field3 .”“……选择”& me!ControlName &“As Field1,Field2,Field3 .”
因此,VBA可以正确地转换控件名称的值。Docmd.RunSQL为你做这件事。执行不能。
发布于 2010-02-20 18:04:59
您的参考资料中有什么版本的DAO?可能是旧版本在mdb上运行良好,但在mde上失败。尝试将其设置为最新版本,并再次编译。
https://stackoverflow.com/questions/2299455
复制相似问题