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 Access 2007 DAO VBA错误3381导致调用方法中的对象;“中断”;_Ms Access_Vba_Dao_Data Access Object - Fatal编程技术网

Ms access Access 2007 DAO VBA错误3381导致调用方法中的对象;“中断”;

Ms access Access 2007 DAO VBA错误3381导致调用方法中的对象;“中断”;,ms-access,vba,dao,data-access-object,Ms Access,Vba,Dao,Data Access Object,---经进一步调查--- 下例中的“tblABC”必须是链接表(到另一个Access数据库) 如果“tblABC”与代码位于同一数据库中,则不会发生问题。 嗨 我们最近已升级到Office2007 我们有一种方法,其中有一个开放记录集(DAO)。然后我们调用另一个子系统(下面的updateSub)来执行SQL。此方法有自己的错误处理程序。如果遇到错误3381,那么调用方法中的记录集将变为“unset”,我们将得到错误3420“对象无效或不再设置”。UpdateSub中的其他错误不会导致相同的问题

---经进一步调查--- 下例中的“tblABC”必须是链接表(到另一个Access数据库)

如果“tblABC”与代码位于同一数据库中,则不会发生问题。 嗨

我们最近已升级到Office2007

我们有一种方法,其中有一个开放记录集(DAO)。然后我们调用另一个子系统(下面的updateSub)来执行SQL。此方法有自己的错误处理程序。如果遇到错误3381,那么调用方法中的记录集将变为“unset”,我们将得到错误3420“对象无效或不再设置”。UpdateSub中的其他错误不会导致相同的问题

此代码在Access 2003中运行良好

Private Sub Whatonearth()

    Dim rs As dao.Recordset

    set rs = CurrentDb.OpenRecordset("tblLinkedABC")

    Debug.Print rs.RecordCount

    UpdatingSub "ALTER TABLE tblTest DROP Column ColumnNotThere"

    'Error 3240 occurs on the below line even though err 3381 is trapped in the calling procedure
    'This appears to be because error 3381 is encountered when calling UpdatingSub     above  
    Debug.Print rs.RecordCount

End Sub


Private Sub WhatonearthThatWorks()

    Dim rs As dao.Recordset

    set rs = CurrentDb.OpenRecordset("tblLinkedABC")

    Debug.Print rs.RecordCount

    'Change the update to generate a different error
    UpdatingSub "NONSENSE SQL STATEMENT"
    'Error is trapped in UpdatingSub. Next line works fine.
    Debug.Print rs.RecordCount

End Sub


Private Sub UpdatingSub(strSQL As String)
    On Error GoTo ErrHandler:
    CurrentDb.Execute strSQL

ErrHandler:
    'LogError'

End Sub
有什么想法吗?我们正在运行Office Access 2007(12.0.6211.1000)SP1 MSO(12.0.6425.1000)。也许可以看看SP2是否可以分发


很抱歉设置格式-不确定如何解决此问题。

此错误表示表中没有此类列。上面的代码只能运行一次。在删除列(字段)之前,您可能希望检查该列(字段)是否存在

评论后编辑:

Private Sub Whatonearth()
    Dim rs As DAO.Recordset

    strColName = "ColumnNotThere"

    Set rs = CurrentDb.OpenRecordset("tblABC")

    For Each fld In rs.Fields
        If fld.Name = strColName Then

            Debug.Print rs.RecordCount

            ''The recordset will have to be closed
            ''before calling UpdatingSub 
            rs.Close

            UpdatingSub "ALTER TABLE tblABC DROP Column " & strColName

            ''Debug.Print rs.RecordCount

            Exit For
        End If
    Next

End Sub

''To get a proper error with SQL, you need dbFailOnError
''You may also need to loop through the errors collection*
Private Sub UpdatingSub(strSQL As String)
    On Error GoTo ErrHandler
    CurrentDb.Execute strSQL, dbFailOnError

ErrHandler:
    ''LogError
    Debug.Print Err.Description
End Sub


该错误表示表中没有此类列。上面的代码只能运行一次。在删除列(字段)之前,您可能希望检查该列(字段)是否存在

评论后编辑:

Private Sub Whatonearth()
    Dim rs As DAO.Recordset

    strColName = "ColumnNotThere"

    Set rs = CurrentDb.OpenRecordset("tblABC")

    For Each fld In rs.Fields
        If fld.Name = strColName Then

            Debug.Print rs.RecordCount

            ''The recordset will have to be closed
            ''before calling UpdatingSub 
            rs.Close

            UpdatingSub "ALTER TABLE tblABC DROP Column " & strColName

            ''Debug.Print rs.RecordCount

            Exit For
        End If
    Next

End Sub

''To get a proper error with SQL, you need dbFailOnError
''You may also need to loop through the errors collection*
Private Sub UpdatingSub(strSQL As String)
    On Error GoTo ErrHandler
    CurrentDb.Execute strSQL, dbFailOnError

ErrHandler:
    ''LogError
    Debug.Print Err.Description
End Sub


谢谢你的意见,也很抱歉我的问题让你感到困惑,这是一个奇怪的问题。我在一台正在运行的电脑上试过

Office Access 2007(12.0.6423.1000)SP2 MSO(12.0.6425.1000)

而不是

Office Access 2007(12.0.6211.1000)SP1 MSO(12.0.6425.1000)


我没有遇到同样的问题。是时候看看我们是否可以获得安装新版本的权限了。

谢谢您的所有输入-对于我的问题带来的任何困惑,我深表歉意-这是一个奇怪的问题。我在一台正在运行的电脑上试过

Office Access 2007(12.0.6423.1000)SP2 MSO(12.0.6425.1000)

而不是

Office Access 2007(12.0.6211.1000)SP1 MSO(12.0.6425.1000)


我没有遇到同样的问题。是时候看看我们是否可以获得安装新版本的权限了。

我很高兴其他人也遇到了这个问题。我遇到了完全相同的问题(错误3381导致DAO记录集出现问题),以及在SQLServer2000上运行SQL语句的传递查询

一旦我阻止了错误3381的发生(通过在试图从表中删除字段之前检查字段的存在),就没有进一步的问题了

值得一提的是,我运行的是OfficeAccess2007(12.0.6211.1000)SP1MSO(12.0.6320.5000)


显然,这似乎是一个Access DAO问题,Microsoft可能已经通过以后的Service Pack解决了。

我很高兴其他人也遇到了这个问题。我遇到了完全相同的问题(错误3381导致DAO记录集出现问题),以及在SQLServer2000上运行SQL语句的传递查询

一旦我阻止了错误3381的发生(通过在试图从表中删除字段之前检查字段的存在),就没有进一步的问题了

值得一提的是,我运行的是OfficeAccess2007(12.0.6211.1000)SP1MSO(12.0.6320.5000)


显然,这似乎是一个Access DAO问题,Microsoft可能已经通过更高版本的Service Pack解决了。

绝对如此。抱歉-应该提到我并不担心避免错误,而是为什么在“updateSub”中处理的错误会对调用方法“Whatonearth”中的记录集对象产生任何影响。不应该,所以我想知道这是否是我正在使用的Acces/VBA版本中的一个bug…我不太明白你的意思。如果一个过程调用另一个过程,第一个过程将受到被调用过程中错误的影响。跟踪错误时,通常会注释掉错误处理。我已经添加了一些可能有用的注释。谢谢你的帖子。看来我的问题有点不清楚。我试着对它进行编辑,使它更清晰。基本上,如果“updateSub”中出现错误3381,那么调用方法中就会出现意外错误。如果发生3381以外的错误,则调用方法可以正常进行。。。真奇怪。抱歉-应该提到我并不担心避免错误,而是为什么在“updateSub”中处理的错误会对调用方法“Whatonearth”中的记录集对象产生任何影响。不应该,所以我想知道这是否是我正在使用的Acces/VBA版本中的一个bug…我不太明白你的意思。如果一个过程调用另一个过程,第一个过程将受到被调用过程中错误的影响。跟踪错误时,通常会注释掉错误处理。我已经添加了一些可能有用的注释。谢谢你的帖子。看来我的问题有点不清楚。我试着对它进行编辑,使它更清晰。基本上,如果“updateSub”中出现错误3381,那么调用方法中就会出现意外错误。如果发生3381以外的错误,则调用方法可以正常进行。。。当您没有为错误处理程序提供代码时,很难诊断错误处理问题。值得一提的是,这两个sub中都应该有一个错误处理程序。另外,我建议在CurrentDB.executecommand.Hi上添加dbFailOnError选项。这不是我真正的代码,它只是一个示例,用于演示Access/VBA中的错误。我将编辑这篇文章,试图把我的问题弄清楚。:)那么你想做什么?使代码在链接表上工作,或者如果是链接表,则放弃?两者都很简单,connect属性应该会有所帮助。请注意,如果以引用方式使用该列,您可能也会遇到问题。Nope。我知道如何使代码工作,我想了解为什么VBA在调用方法中错误地导致错误。当