Не може да улавяне на конкретни ODBC грешки в OnError свойство на формуляр (КБ 206175)

Забележка: Бихме искали да ви осигурим най-новото помощно съдържание възможно най-бързо на вашия собствен език. Тази страница е преведена чрез автоматизация и може да съдържа граматически грешки и несъответствия. Нашата цел е това съдържание да ви бъде полезно. Можете ли да ни кажете дали информацията е била полезна за вас, в дъното на тази страница? Ето статията на английски за бърза справка.

Ако зададете свойството OnError на формуляр на Access процедура за събитие, можете да извличате описанието на ODBC грешка в тази процедура и също така можете да улавяне на определена грешка ODBC. Когато възникне грешка ODBC, единствената информация, която се предава процедура за събитие грешка е броят на обща грешка, като например 3146, което съответства на съобщението за грешка: ODBC повикване е неуспешно.

Причина

ODBC съобщения за грешка обикновено се състоят от два компонента. Първият компонент е грешка 3146, чието описание е:

Неуспешно извикване на ODBC

Специфични за сървъра информацията се съдържа в Вторият компонент, от който можете да извлечете номер на грешка и описание, като например:

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

Ако зададете свойството OnError формуляра процедура за събитие, можете да улавяне на броя на първия компонент на грешката, но не може да улавяне на броя на втория компонент. Информация, специфична за сървъра във втората част на ODBC грешка на екрана се появи след кода завърши изпълнява, освен ако не сте включили следния ред в случай процедура:

Отговор = acDataErrContinue

Разделителна способност

Забележка: Microsoft предоставя примери за илюстрация само, без гаранцията или подразбиращи. Това включва, но не се ограничава до, косвени гаранции или фитнес за определена цел. В тази статия предполага, че сте запознати с демонстрирания език за програмиране и инструментите, които се използват за създаване и за отстраняване на грешки в процедурите. Инженерни за поддръжка на Microsoft могат да ви помогнат обяснение на функциите на конкретна процедура, но няма да модифицират тези примери за предоставяне на допълнителна функционалност или изграждане на процедури, за да отговарят на вашите конкретни изисквания.

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

DAO съдържа грешки в колекция от сайтове, които можете да използвате за улавяне информация, специфична за сървъра във втората част на ODBC грешка. Когато възникне грешка ODBC, първият компонент се съхранява в първия елемент на грешки в колекцията от сайтове и Вторият компонент се съхранява в Вторият елемент.

Пример в тази статия използва събитието BeforeUpdate вместо грешка събитие за улавяне на конкретни ODBC грешки. За да създадете функция, която капани конкретни ODBC грешки, когато възникне BeforeUpdate събитие на формуляр, изпълнете следните стъпки:

  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. Задайте свойството BeforeUpdate на формуляра за 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 Insider

Беше ли полезна тази информация?

Благодарим ви за обратната връзка!

Благодарим ви за вашата обратна връзка. Изглежда, че ще бъде полезно да ви свържем с един от нашите агенти по поддръжката на Office.

×