Access 2007 DAO VBA Ошибка 3381 приводит к "поломке" объектов в вызывающих методах

--- ПОСЛЕ ДАЛЬНЕЙШЕГО ИССЛЕДОВАНИЯ --- "tblABC" в приведенном ниже примере должна быть связанной таблицей (с другой базой данных Access).

Если "tblABC" находится в той же базе данных, что и код, то проблема не возникает.

Привет,

Мы недавно обновились до Office 2007.

У нас есть метод, в котором у нас есть открытый набор записей (DAO). Затем мы вызываем другую подпрограмму (UpdatingSub ниже), которая выполняет SQL. Этот метод имеет свой собственный обработчик ошибок. Если обнаружена ошибка 3381, то набор записей в вызывающем методе становится "неустановленным", и мы получаем ошибку 3420 "Объект недействителен или больше не установлен". Другие ошибки в UpdatingSub не вызывают ту же проблему.

Этот код отлично работает в 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

Какие-нибудь мысли? Мы используем MSO Office Access 2007 (12.0.6211.1000) с пакетом обновления 1 (12.0.6425.1000). Может быть, посмотреть, можно ли распространять SP2?

Извините за форматирование - не уверен, как это исправить.

3 ответа

Решение

Спасибо за ваш вклад - и извините за путаницу в отношении моей проблемы - это было странно. Я попробовал это на ПК работает

Office Access 2007 (12.0.6423.1000) с пакетом обновления 2 (SP2) MSO (12.0.6425.1000)

скорее, чем

Office Access 2007 (12.0.6211.1000) с пакетом обновления 1 (SP1) MSO (12.0.6425.1000)

и я не получаю ту же проблему. Пора посмотреть, сможем ли мы получить полномочия для установки более новой версии.

Эта ошибка означает, что в таблице нет такого столбца. Код выше может быть запущен только один раз. Вы можете проверить наличие столбца (поля) перед его удалением.

Отредактировано после комментария:

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

   '' Enumerate Errors collection and display properties of
   '' each Error object.
   For Each errLoop In Errors
      With errLoop
         strError = _
            "Error #" & .Number & vbCrLf
         strError = strError & _
            "  " & .Description & vbCrLf
         strError = strError & _
            "  (Source: " & .Source & ")" & vbCrLf
      End With

Я рад, что кто-то еще столкнулся с этой проблемой. У меня была точно такая же проблема (ошибка 3381, вызывающая проблемы с набором записей DAO), а также с передачей запросов, выполняющих операторы SQL на SQL Server 2000.

Как только я предотвратил ошибку 3381 (проверив наличие поля перед тем, как пытаться удалить его из таблицы), проблем больше не было.

Что бы это ни стоило, я использовал MS Access Office 2007 (12.0.6211.1000) с пакетом обновления 1 (12.0.6320.5000).

Определенно похоже на проблему Access DAO, которую Microsoft могла решить с помощью более позднего пакета обновления.

Другие вопросы по тегам