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 могла решить с помощью более позднего пакета обновления.