Nie można przechwytywać błędy ODBC określonych we właściwości OnError formularza (KB 206175)

Uwaga: Staramy się udostępniać najnowszą zawartość Pomocy w Twoim języku tak szybko, jak to możliwe. Ta strona została przetłumaczona automatycznie i może zawierać błędy gramatyczne lub nieścisłości. Chcemy, aby ta zawartość była dla Ciebie przydatna. Prosimy o powiadomienie nas, czy te informacje były pomocne, u dołu tej strony. Oto angielskojęzyczny artykuł do wglądu.

Jeśli właściwość OnError formularza programu Access jest ustawiona na procedurę zdarzenia, nie można pobrać opis błąd ODBC w tej procedurze, a także nie zostanie umieszczony konkretnego problemu ODBC. W przypadku wystąpienia błędu ODBC tylko informacje, które są przekazywane do procedury zdarzenia błędu jest liczba błąd ogólny, takich jak 3146, która odpowiada komunikat o błędzie: wywołanie ODBC nie powiodło się.

Przyczyna

Komunikat o błędzie ODBC składają się zwykle z dwóch części. Pierwszy element jest błąd 3146, których opisy jest:

Połączenia ODBC nie powiodło się.

Informacje o błędzie specyficzne dla serwera znajduje się w składniku drugi, z której można pobrać numer błędu i opis takich jak:

[Microsoft] [Sterownik ODBC SQL Server] [SQL Server] < komunikat o błędzie specyficzne dla serwera > (#< numer błędu >)

Jeśli właściwość OnError formularza jest ustawiona na procedurę zdarzenia, można utworzyć liczbę pierwszy element błędu, ale nie przechwytywania liczbę drugi składnik. Informacje dotyczące serwera w drugiej części błąd ODBC pojawi się na ekranie po kodzie zakończy działanie, chyba że zdarzeń umieścić następujący wiersz procedury:

Odpowiedź = acDataErrContinue

Rozdzielczość

Uwaga: Firma Microsoft udostępnia przykłady programowania dla ilustracji, bez jakichkolwiek gwarancji ani pośredni. Zawiera, ale nie jest ograniczone do dorozumianych gwarancji przydatności handlowej lub do określonego celu. W tym artykule założono, że zaznajomieni z przedstawiono jest język programowania i narzędzi, które są używane do tworzenia i debugowania procedur. Pracownicy pomocy technicznej firmy Microsoft mogą pomóc wyjaśnić funkcję konkretnej procedury, ale nie będą modyfikować tych przykładów ani dodawać funkcjonalności i konstruować procedur w celu dostosowania do określonych potrzeb użytkownika.

Możesz utworzyć Microsoft Visual Basic for procedurę aplikacji, która używa obiektów DAO (Data Access) do aktualizacji jest oparty na formularzu Właściwości . Pozwala do przechwytywania wszelkie komunikaty o błędach, które otrzymujesz.

DAO zawiera zbiór błędów, który można używać do przechwytywania informacje dotyczące serwera w drugiej części błąd ODBC. W przypadku wystąpienia błędu ODBC pierwszy element jest przechowywany w pierwszym elementem kolekcji błędów, a drugi składnik znajduje się w drugi element.

Przykład w tym artykule korzysta ze zdarzenia BeforeUpdate zamiast zdarzenie błędu do przechwytywania konkretnych błędów ODBC. Aby utworzyć funkcję, która pułapki konkretnych błędów ODBC po wystąpieniu zdarzenia BeforeUpdate formularza, wykonaj następujące kroki:

  1. Tworzenie pusta baza danych dla komputerów stacjonarnych.

  2. Tworzenie łącza do tabeli dbo_Accounts z przykładowej bazy danych AdventureWorks program Microsoft SQL Server.

  3. Za pomocą Kreatora formularzy - kolumnowy układ, aby utworzyć nowy formularz na podstawie tabeli konta.

  4. Zapisz formularz jako frmAccounts.

  5. Utwórz nowy moduł, a następnie wpisz następujący wiersz w sekcji deklaracji, jeśli go nie jest jeszcze dostępne:

    Opcja jawne

  6. Wpisz lub Wklej poniższą procedurę w module:

    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. Zapisz moduł z unikatową nazwę i zamknij okno.

  8. Ustawianie właściwości BeforeUpdate formularza frmAccounts następującą procedurę zdarzenia:

    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. W menu Debuguj kliknij skompilować < nazwa bazy danych >

  10. Jeśli wystąpią nie błędy, Zapisz formularz.

  11. Otwórz formularz frmAccounts i dodać nowy rekord lub edytowanie rekordu.

    Po wprowadzeniu zmian do rekordu rekord jest zapisany po przejściu do innego rekordu. Jeśli wystąpi błąd ODBC, pojawi się komunikat niestandardowy, oparty na błędu specyficzne dla serwera oraz ogólnego "ODBC — połączenie nie powiodło się" jest kolor wiadomości.

Rozwijaj umiejętności związane z pakietem Office
Poznaj szkolenia
Uzyskuj nowe funkcje w pierwszej kolejności
Dołącz do niejawnych testerów pakietu Office

Czy te informacje były pomocne?

Dziękujemy za opinię!

Dziękujemy za opinię! Wygląda na to, że połączenie Cię z jednym z naszych agentów pomocy technicznej pakietu Office może być pomocne.

×