Перейти к основному контенту
Office

Нельзя отслеживать определенные ODBC ошибки в свойстве OnError формы (206175 КБ)

Примечание: Мы стараемся как можно оперативнее обеспечивать вас актуальными справочными материалами на вашем языке. Эта страница переведена автоматически, поэтому ее текст может содержать неточности и грамматические ошибки. Для нас важно, чтобы эта статья была вам полезна. Просим вас уделить пару секунд и сообщить, помогла ли она вам, с помощью кнопок внизу страницы. Для удобства также приводим ссылку на оригинал (на английском языке).

Процедура обработки события, если свойство OnError формы Access не удается получить описание ошибки ODBC в этой процедуре, а также невозможно ловушки конкретной ошибке ODBC. При возникновении ошибки ODBC, только данные, которые переданы процедуру события ошибки — количество Общая ошибка, например 3146, который соответствует сообщение об ошибке: ошибка при вызове ODBC.

Причина

Сообщения об ошибках ODBC обычно состоят из двух частей. Первый компонент которого описание ошибки 3146, имеет следующий вид:

Сбой вызова ODBC

Сведения об ошибке сервер определенного содержащиеся в второй компонент, из которой можно извлечь номер ошибки и описание, такие как:

[Microsoft] [Драйвер ODBC сервера SQL] [SQL Server] < сообщение об ошибке сервер определенного > (#< номер ошибки >)

Если задать свойство OnError формы процедуру события, может перехватить номер первого компонента ошибки, но нельзя ловушки количество второй компонент. Сервер сведений во второй части ошибка ODBC на экране появляется после завершения кода работает, если не включить следующую строку в случае процедуры:

Ответ = acDataErrContinue

Разрешение

Примечание: Microsoft примеры программирования только для иллюстрации и без гарантий выраженное или подразумевается. Включает в себя, но не ограничивается гарантий окупаемость или Фитнес для определенной цели. В этой статье предполагается, что вы знакомы с языком программирования предложенном и с помощью средств, которые используются для создания и отладки процедур. Сотрудники службы поддержки Майкрософт могут пояснить конкретной процедуры, но не будет изменен в приведенных примерах для обеспечения функциональных возможностей или создания процедур в соответствии с конкретными требованиями.

Можно создать Microsoft Visual Basic для приложений процедуры, которая использует объекты доступа к данным (DAO), чтобы обновить RecordsetClone , основанного на форме. Это дает возможность перехватить любое сообщение об ошибке, которое вы получаете.

DAO содержит коллекцию ошибок, которые можно использовать для обнаружения сервера сведений во второй части ошибка ODBC. При возникновении ошибки ODBC, первый компонент сохраняется в первый элемент в коллекцию ошибок и второй компонент хранятся в второй элемент.

В этой статье примере событие до обновления вместо ошибки событий для обнаружения ошибок ODBC. Чтобы создать функцию, ловушки ODBC ошибок при наступлении события до обновления формы, выполните следующие действия:

  1. Создайте пустую базу данных рабочего стола.

  2. Ссылка на dbo_Accounts таблицы в базе данных AdventureWorks в Microsoft SQL Server.

  3. Использование мастера форм - макете, чтобы создать новую форму, основанный на таблице учетные записи.

  4. Сохранение формы в виде frmAccounts.

  5. Создайте новый модуль, а затем введите следующую строку в раздел описаний Если этой строке еще нет:

    Option Explicit

  6. Введите или вставьте в модуль указанные ниже действия:

    Public Function SaveRecODBC(SRO_form As Form) As Boolean
    ' ***************************************************************
    ' Function: SaveRecODBC
    ' Purpose: Updates a form based on a linked ODBC table
    ' and traps any ODBC errors.
    ' Arguments: SRO_Form, which refers to the form.
    ' Returns: True if successful or False if an error occurs.
    ' ***************************************************************
    On Error GoTo SaveRecODBCErr
    Dim fld As Field, ctl As Control
    Dim errStored As Error
    Dim rc As DAO.Recordset
    
    ' Check to see if the record has changed.
    If SRO_form.Dirty Then
        Set rc = SRO_form.Recordset.Clone
        If SRO_form.NewRecord Then
            rc.AddNew
            For Each ctl In SRO_form.Controls
                ' Check to see if it is the type of control
                ' that has a ControlSource.
                If ctl.ControlType = acTextBox Or _
                    ctl.ControlType = acComboBox Or _
                    ctl.ControlType = acListBox Or _
                    ctl.ControlType = acCheckBox Then
                    ' Verify that a value exists in the ControlSource.
                    If ctl.Properties("ControlSource") <> "" Then
                        ' Loop through the fields collection in the
                        ' RecordsetClone. If you find a field name
                        ' that matches the ControlSource, update the
                        ' field. If not, skip the field. This is
                        ' necessary to account for calculated controls.
                        For Each fld In rc.Fields
                            ' Find the field and verify
                            ' that it is not Null.
                            ' If it is Null, don't add it.
                            If fld.Name = ctl.Properties("ControlSource") _
                            And Not IsNull(ctl) Then
                                fld.Value = ctl
                                ' Exit the For loop
                                ' if you have a match.
                                Exit For
                            End If
                        Next fld
                    End If ' End If ctl.Properties("ControlSource")
                End If ' End If ctl.controltype
            Next ctl
            rc.Update
        Else
            ' This is not a new record.
            ' Set the bookmark to synchronize the record in the
            ' RecordsetClone with the record in the form.
            rc.Bookmark = SRO_form.Bookmark
            rc.Edit
            For Each ctl In SRO_form.Controls
                ' Check to see if it is the type of control
                ' that has a ControlSource.
                If ctl.ControlType = acTextBox Or _
                    ctl.ControlType = acComboBox Or _
                    ctl.ControlType = acListBox Or _
                    ctl.ControlType = acCheckBox Then
                    ' Verify that a value exists in the
                    ' ControlSource.
                    If ctl.Properties("ControlSource") <> "" Then
                        ' Loop through the fields collection in the
                        ' RecordsetClone. If you find a field name
                        ' that matches the ControlSource, update the
                        ' field. If not, skip the field. This is
                        ' necessary to account for calcualted controls.
                        For Each fld In rc.Fields
                            ' Find the field and make sure that the
                            ' value has changed. If it has not
                            ' changed, do not perform the update.
                            If fld.Name = ctl.Properties("ControlSource") _
                                And fld.Value <> ctl And _
                                Not IsNull(fld.Value <> ctl) Then
                                fld.Value = ctl
                                ' Exit the For loop if you have a match.
                                Exit For
                            End If
                        Next fld
                    End If ' End If ctl.Properties("ControlSource")
                End If ' End If ctl.controltype
            Next ctl
            rc.Update
        End If ' End If SRO_form.NewRecord
    End If ' End If SRO_form.Dirty
    ' If function has executed successfully to this point then
    ' set its value to True and exit.
    SaveRecODBC = True
    
    Exit_SaveRecODBCErr:
        Exit Function
    
    SaveRecODBCErr:
    ' The function failed because of an ODBC error.
    ' Below are a list of some of the known error numbers.
    ' If you are not receiving an error in this list,
    ' add that error to the Select Case statement.
    For Each errStored In DBEngine.Errors
        Select Case errStored.Number
            Case 3146 ' No action -- standard ODBC--Call failed error.
            Case 2627 ' Error caused by duplicate value in primary key.
                MsgBox "You tried to enter a duplicate value in the Primary Key."
            Case 3621 ' No action -- standard ODBC command aborted error.
            Case 547 ' Foreign key constraint error.
                MsgBox "You violated a foreign key constraint."
            Case Else ' An error not accounted for in the Select Case ' statement.
                On Error GoTo 0
                Resume
        End Select
    Next errStored
    SaveRecODBC = False
    Resume Exit_SaveRecODBCErr
    
    End Function
    
  7. Сохраните модуль уникальное имя и закройте окно модуля.

  8. Задайте для свойства до обновления формы frmAccounts следующую процедуру события.

    Private Sub Form_BeforeUpdate(Cancel As Integer)
    ' If you can save the changes to the record undo the changes on the form.
    If SaveRecODBC(Me) Then Me.Undo
    ' If this is a new record go to the last record on the form.
    If Me.NewRecord Then
        RunCommand acCmdRecordsGoToLast
    Else
        ' If you can't update the record, cancel the BeforeUpdate event.
        Cancel = -1
    End If
    End Sub
    
  9. В меню Отладка щелкните компиляции < имя базы данных >

  10. Если не происходит ошибки, сохраните форму.

  11. Откройте форму frmAccounts и добавить новую запись или изменить запись.

    При изменении записи запись сохраняется при переходе к другой записи. Если возникает ошибка ODBC, появится настраиваемое сообщение об ошибке для конкретного сервера, на основе и универсальный «ODBC - ошибка вызова» содержатся сообщения.

Совершенствование навыков работы с Office
Перейти к обучению
Первоочередный доступ к новым возможностям
Присоединиться к программе предварительной оценки Office

Были ли сведения полезными?

Спасибо за ваш отзыв!

Благодарим за отзыв! Возможно, будет полезно связать вас с одним из наших специалистов службы поддержки Office.

×