Nu pot capta erorile specifice ODBC în acțiunea proprietatea dintr-un formular (KB 206175)

Notă: Dorim să vă oferim cel mai recent conținut de ajutor, cât mai rapid posibil, în limba dvs. Această pagină a fost tradusă automatizat și poate conține erori gramaticale sau inexactități. Scopul nostru este ca acest conținut să vă fie util. Vă rugăm să ne spuneți dacă informațiile v-au fost utile, în partea de jos a acestei pagini. Aici se află articolul în limba engleză, ca să îl puteți consulta cu ușurință.

Dacă setați proprietatea acțiunea unui formular Access la o procedură eveniment, nu puteți prelua Descrierea o eroare ODBC în acea procedură și puteți, de asemenea, nu puteți capta unei erori specifice ODBC. Atunci când apare o eroare ODBC, numai informații pe care îi este transmisă eroare eveniment procedură este numărul de o eroare generic, cum ar fi 3146, care corespunde cu mesajul de eroare: ODBC apel nu a reușit.

Cauza

Mesaje de eroare ODBC în mod normal, format din două componente. Primul component este eroare 3146, a cărui descriere este:

Apel ODBC nu a reușit

Informațiile despre eroare specifice pentru server este inclusă în a doua componentă, de la care o puteți regăsi un număr de eroare și o descriere, cum ar fi:

[Microsoft] [ODBC SQL Server Driver] [SQL Server] < mesaj de eroare de Server specifice > (#< numărul erorii >)

Dacă setați proprietatea acțiunea unui formular pentru a o procedură eveniment, puteți capta numărul din prima componenta eroarea, dar nu poate capta numărul de al doilea element. Informații specifice de server în a doua parte a ODBC eroarea apare pe ecran după codul s-a terminat rulează, în afara cazului în care includ următoarea linie în cazul procedură:

Răspuns = acDataErrContinue

Rezolvare

Notă: Microsoft furnizează exemple de programare pentru ilustrație doar, fără garanție fie exprimate sau implicite. Aceasta include, dar nu se limitează la, există garanții implicite de comercializare sau potrivire pentru un anumit scop. Acest articol presupune că sunteți familiarizat cu limbajul de programare care se demonstrează și cu instrumente care sunt utilizate pentru a crea și a depana proceduri. Inginerii de asistență Microsoft vă poate ajuta explica funcționalitatea o anumită procedură, dar nu se va modifica aceste exemple pentru a furniza funcționalități de adăugat sau a construi proceduri pentru a îndeplini cerințe de specifice.

Puteți să creați un Microsoft Visual Basic for Applications procedură care utilizează Data Access Objects (DAO) pentru a actualiza o proprietatea care se bazează pe formularul. Acest lucru vă permite să capta orice mesaj de eroare pe care le primiți.

DAO conține o colecție de erori care se pot utiliza pentru a capta informații specifice de server în a doua parte a eroarea ODBC. Atunci când apare o eroare ODBC, o componentă prima este stocat în primul element din colecția de erori și a doua componentă este stocat în al doilea element.

Exemplul din acest articol utilizează evenimentul BeforeUpdate în loc de Eroare eveniment pentru a capta specifice ODBC erorile. Pentru a crea o funcție care capcane anumite ODBC erori atunci când are loc evenimentul BeforeUpdate a unui formular, urmați acești pași:

  1. Creați o bază de date desktop necompletată.

  2. Link către tabelul dbo_Accounts din baza de date eșantion AdventureWorks în Microsoft SQL Server.

  3. Utilizați Expertul formular - aspect coloane pentru a crea un formular nou bazat pe tabelul conturi.

  4. Salvați formularul ca frmAccounts.

  5. Creați un nou modul și tastați următoarea linie în secțiunea declarații dacă acea linie nu este deja acolo:

    Opțiunea explicită

  6. Tastați sau lipiți următoarea procedură în modulul:

    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. Salvați modulul cu un nume unic și închideți fereastra modulului.

  8. Setați proprietatea a formularului frmAccounts la următoarea procedură eveniment:

    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. În meniul de depanare , faceți clic pe compilare < numele bazei de date >

  10. Dacă nu există erori să apară, salvați formularul.

  11. Deschideți formularul frmAccounts, apoi adăugați o înregistrare nouă sau editarea unei înregistrări.

    Atunci când efectuați o modificare la o înregistrare, înregistrarea se salvează atunci când mutați la altă înregistrare. Dacă apare o eroare ODBC, vedeți mesajul particularizate care se bazează pe eroarea server specifice și generic "ODBC - apelarea nereușită" mesajul este prins.

Extindeți-vă competențele Office
Explorați instruirea
Fiți primul care obține noile caracteristici
Alăturați-vă utilizatorilor Office Insider

Au fost utile aceste informații?

Vă mulțumim pentru feedback!

Vă mulțumim pentru feedback! Se pare că ar fi util să luați legătura cu unul dintre agenții noștri de asistență Office.

×