Не вдалося виявлення певних ODBC помилок у разі помилки властивості форми (KB 206175)

Примітка.: Ми хочемо надавати найновіший вміст довідки рідною мовою користувачів якомога швидше. Цю сторінку перекладено за допомогою засобу автоматичного перекладу, тому вона може містити смислові, синтаксичні або граматичні помилки. Ми вважаємо, що цей вміст стане вам у пригоді. Повідомте нас, чи була інформація корисною, унизу цієї сторінки. Для зручності цю статтю можна переглянути англійською мовою.

Якщо встановити процедуру події дія властивості форми Access, не вдалося отримати Опис помилка ODBC цієї процедури, і ви також не виявлення певної помилки ODBC. Коли виникає помилка ODBC, лише відомості, що передається до процедури події помилки — число загальні помилки, наприклад 3146, що відповідає повідомлення про помилку: ODBC-виклику.

Причина

Повідомлення про помилку ODBC зазвичай складається з двох компонентів. Перший компонент є помилка 3146, чиї Опис:

Не вдалося ODBC виклику

Відомості про помилку сервера конкретних міститься в другий компонент, з якої ви можете отримати повідомлення про помилку номер і опис, такі як:

[Microsoft] [ODBC SQL Server для роботи драйвера] < Сервер конкретного повідомлення про помилку > [SQL Server] (#< номер помилки >)

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

Відповідь = acDataErrContinue

Роздільна здатність

Примітка.: Корпорація Майкрософт надає приклади програмного коду тільки для ілюстрації без гарантії, виражений або мається на увазі. Це включає в себе, але не обмежено до, гарантій придатності або для певних цілей. У цій статті припускається, що ви знайомі з мова програмування, що демонструються і інструменти, які використовуються для створення та налагодження процедур. Співробітники служби підтримки Microsoft можна пояснити можливості певної дії, але вони не змінить у цих прикладах для надання доданий функціональність або побудувати дій, щоб задовольнити вимоги.

Ви можете створити Microsoft Visual Basic for Applications процедуру, яка використовує об'єкти доступу до даних (DAO), щоб оновити RecordsetClone на основі форми. Це дає змогу виявлення будь-якого ви отримуєте повідомлення про помилку.

DAO містить помилки колекції, які можна використовувати для виявлення сервера певних відомостей у другій частині помилка ODBC. Коли виникає помилка ODBC, перший компонент зберігається в перший елемент колекції помилки та другий компонент зберігається в другому елемент.

Приклад у цій статті використання оновленням події замість події помилок для виявлення помилки у відповідних ODBC. Щоб створити функцію, яка закриває помилки у відповідних ODBC, коли оновленням події форми, виконайте такі дії:

  1. Створення пустої бази даних для настільних комп'ютерів.

  2. Посилання на таблицю dbo_Accounts AdventureWorks зразком бази даних у програмі Microsoft SQL Server.

  3. За допомогою майстра форм - стовпчастих макет для створення нової форми на основі таблиці облікові записи.

  4. Збереження форми як frmAccounts.

  5. Створіть новий модуль а потім введіть наведений нижче рядок у розділі оголошень, якщо цього рядка ще не там:

    Параметр явне

  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, з яким ми вас можемо з’єднати.

×