Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access Execute方法在访问mde时失败_Ms Access_Dao - Fatal编程技术网

Ms access Execute方法在访问mde时失败

Ms access Execute方法在访问mde时失败,ms-access,dao,Ms Access,Dao,首先,我使用的是Access 2000和DAO。我有一段代码,它执行一个简单的插入查询,我使用db.Execute调用这个查询。这段代码在mdb中运行良好。然而,如果我编译成mde,那么 错误5-过程调用或参数无效 在这一行,记录不会被插入。但是,如果使用完全相同的SQL语句从db.Execute更改为DoCmd.RunSQL,则插入记录时不会出现任何问题。有人知道为什么DAO数据库对象的DAO执行方法在我编译成MDE后会突然停止工作吗 注意:只有在指定.Execute方法的dbFailOnEr

首先,我使用的是Access 2000和DAO。我有一段代码,它执行一个简单的插入查询,我使用db.Execute调用这个查询。这段代码在mdb中运行良好。然而,如果我编译成mde,那么

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

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

注意:只有在指定.Execute方法的dbFailOnError选项时,才会出现错误。如果禁用该选项,则不会出现错误,但记录仍然没有插入

编辑: 该行在MDE中失败,但在MDB中工作正常:

从上面代码行上带有断点的即时窗口:

?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是否支持从另一个类模块中调用一个类模块吗?[这不是一个问题。我已经仔细考虑过了。请参阅我的完整答案。]

可能是在传递给Execute语句的字符串中使用了表单控件引用。那就是我!ControlName在引号中。更改它,使其在引号之外。这就是改变。。。。选择我!控件名为字段1、字段2、字段3。。。到选择我!ControlName和As字段1、字段2、字段3


因此VBA可以正确地转换控件名的值。Docmd.RunSQL会为您完成这项工作。Execute不执行。

可能是在传递给Execute语句的字符串中使用了表单控件引用。那就是我!ControlName在引号中。更改它,使其在引号之外。这就是改变。。。。选择我!控件名为字段1、字段2、字段3。。。到选择我!ControlName和As字段1、字段2、字段3


因此VBA可以正确地转换控件名的值。Docmd.RunSQL会为您完成这项工作。Execute不执行。

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

您的参考中有什么DAO版本?可能是旧版本在mdb上工作正常,但在mde上失败。请尝试将其设置为最新版本并重新编译

首先,我向那些试图帮助我的人表示诚挚的歉意。当别人问我问题时,我感到很沮丧,所以我忽略了关键信息,因为我认为它与我无关。以下是我的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函数的长度参数。但是,长度参数不能为负。它肯定是无效的过程调用或参数

我的简单修复方法是从.mdb中删除mdb,只需检查。这也适用于.accdb和.accde2007扩展


再次表示歉意。

首先,我向那些试图帮助我的人表示诚挚的歉意。当别人问我问题时,我感到很沮丧,所以我忽略了关键信息,因为我认为它与我无关。以下是我的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时,字符串.mdb不再出现在t中 他有一个名字。因此,对InStr的调用返回0。和0-1=-1。所以我传递了一个负数作为Left函数的长度参数。但是,长度参数不能为负。它肯定是无效的过程调用或参数

我的简单修复方法是从.mdb中删除mdb,只需检查。这也适用于.accdb和.accde2007扩展



再次表示歉意。

发布您的代码行。如果要在其他代码行中创建插入字符串,请也包括这些代码行。这很有帮助。现在如何定义和设置app.db?这是不寻常的语法。我一直使用currentdb.execute strSQL,Dbfailonerror。我不理解这行代码:App.db.execute。应用程序对象在哪里初始化,它是什么类型的对象?那么什么是子对象db?DoCmd.RunSQL以吃错误而闻名,所以它看起来有效的事实根本不能告诉你任何事情。你反编译过MDB吗?我询问的原因是,可能MDB没有正确编译,而转换为MDE可以消除导致MDB编译错误的任何问题。如果要在其他代码行中创建插入字符串,请也包括这些代码行。这很有帮助。现在如何定义和设置app.db?这是不寻常的语法。我一直使用currentdb.execute strSQL,Dbfailonerror。我不理解这行代码:App.db.execute。应用程序对象在哪里初始化,它是什么类型的对象?那么什么是子对象db?DoCmd.RunSQL以吃错误而闻名,所以它看起来有效的事实根本不能告诉你任何事情。你反编译过MDB吗?我询问的原因是,可能MDB没有正确编译,而转换为MDE可以消除导致MDB编译错误的任何问题。不适用于这种情况。见我的编辑上面。不过,谢谢你花时间帮忙。这不适用于这种情况。见我的编辑上面。不过,谢谢你花时间帮忙。我不会盲目地建议使用最新版本,不管它是什么。DAO 3.6应为参考文件中的版本,且为最新版本。它作为Windows 2000、XP、Vista和7的一部分出现,因此不太可能有不同的版本。没有更新的版本,除非您想使用ACE DAO,它是A2007和更新版本的一部分。由于各种原因,我不推荐使用DAO,尽管它可能非常有效。您应该使用与您正在使用的Access版本配套的DAO版本。如果是A2000、A2002、A2003、ADO 3.6,如果是A2007,则为ACE DAO版本。没有例外。我应该说使用mde的正确版本,而不是最新版本。我认为建议仍然是SOUNDAO和MDE版本并不是真正相关的问题。它是MDE和VBA版本,Access的每个版本都有自己的VBA版本。也就是说,2000年生产的MDE将在2002年和2003年运行,我想是在2007年,等等,也就是说,向前兼容,但A2002 MDE在A2000中无法工作,因为它不向后兼容。DAO 3.6确实是参考中的版本。我不会盲目地建议使用最新版本,不管它是什么。DAO 3.6应为参考文件中的版本,且为最新版本。它作为Windows 2000、XP、Vista和7的一部分出现,因此不太可能有不同的版本。没有更新的版本,除非您想使用ACE DAO,它是A2007和更新版本的一部分。由于各种原因,我不推荐使用DAO,尽管它可能非常有效。您应该使用与您正在使用的Access版本配套的DAO版本。如果是A2000、A2002、A2003、ADO 3.6,如果是A2007,则为ACE DAO版本。没有例外。我应该说使用mde的正确版本,而不是最新版本。我认为建议仍然是SOUNDAO和MDE版本并不是真正相关的问题。它是MDE和VBA版本,Access的每个版本都有自己的VBA版本。也就是说,一个2000年生产的MDE将在2002年和2003年运行,我想是在2007年,等等,也就是说,向前兼容,但是一个A2002的MDE不会在不向后兼容的A2000中工作。DAO 3.6确实是参考中的版本。