Kan ikke finde bestemte ODBC-fejl i VedFejl egenskab for en formular (KB 206175)

Bemærk!: Vi vil gerne give dig den mest opdaterede hjælp, så hurtigt vi kan, på dit eget sprog. Denne side er oversat ved hjælp af automatisering og kan indeholde grammatiske fejl og unøjagtigheder. Det er vores hensigt, at dette indhold skal være nyttigt for dig. Vil du fortælle os, om oplysningerne var nyttige for dig, nederst på denne side? Her er artiklen på engelsk så du kan sammenligne.

Hvis du indstiller egenskaben VedFejl for en Access-formular til en hændelsesprocedure, kan du hente ikke beskrivelsen af en ODBC-fejl i denne procedure, og du kan også fange en bestemt ODBC-fejl. Når en ODBC-fejl opstår, er de eneste oplysninger, der sendes til fejl hændelsesproceduren antallet af en generisk fejl som 3146, som svarer til en fejlmeddelelse om: ODBC-opkald mislykkedes.

Årsag

ODBC-fejlmeddelelser består normalt af to komponenter. Den første komponent er fejl 3146, hvis beskrivelse er:

ODBC-kaldet mislykkedes

Server-specifikke fejloplysninger er indeholdt i den anden komponent, hvorfra du kan hente et fejlnummer og en beskrivelse, f.eks.:

[Microsoft] [ODBC SQL Server-Driver] [SQL Server] < Server-specifikke fejlmeddelelse > (#< fejlnummer >)

Hvis du indstiller egenskaben VedFejl af en formular til en hændelsesprocedure, du kan fange antallet af den første del af fejlen, men du kan ikke fange antallet af den anden komponent. Server-specifikke oplysninger i den anden del af ODBC-fejl vises på skærmen, som når koden er færdig med at køre, medmindre du medtage følgende linje i fremgangsmåde:

Svar = acDataErrContinue

Løsning

Bemærk!: Microsoft yder eksempler illustration kun uden garanti enten direkte eller indirekte. Dette omfatter, men er ikke begrænset til de implicit ansvar for salgbarhed eller fitnesspræsentation til et bestemt formål. Denne artikel forudsætter, at du allerede kender, med ovennævnte programmeringssprog samt de værktøjer, der bruges til at oprette og foretage fejlfinding i procedurer. Microsoft-supportmedarbejdere kan hjælpe med at forklare funktionaliteten i en bestemt procedure, men de kan ikke ændre disse eksempler for at tilføje funktionalitet eller oprette procedurer, så det opfylder dine specifikke krav.

Du kan oprette en Microsoft Visual Basic for Applications-procedure, der bruger objekter (DAO) til at opdatere RecordsetClone , der er baseret på formularen. Dette giver dig mulighed at fange en fejlmeddelelse, som du modtager.

DAO indeholder en fejl af websteder, du kan bruge til at fange server-specifikke oplysninger i den anden del af ODBC-fejl. Når en ODBC-fejl opstår, den første komponent er gemt i det første element i samlingen fejl, og den anden komponent er gemt i det andet element.

Eksemplet i denne artikel anvendes hændelsen FørOpdatering i stedet for hændelsen fejl til at fange specifikke ODBC-fejl. Hvis du vil oprette en funktion, som specifikke ODBC-fejl, når der udsendes hændelsen FørOpdatering af en formular, skal du følge disse trin:

  1. Oprette en tom database på computeren.

  2. Link til tabellen dbo_Accounts i eksempeldatabasen AdventureWorks i Microsoft SQL Server.

  3. Brug af guiden formular - kolonne layout for at oprette en ny formular, der er baseret på tabellen konti.

  4. Gem formularen som frmAccounts.

  5. Opret et nyt modul, og skriv derefter følgende linje i sektionen erklæringer, hvis linjen ikke allerede findes:

    Option Explicit

  6. Skriv eller Indsæt følgende procedure i modulet:

    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. Gem modulet med et entydigt navn, og Luk modulvinduet.

  8. Indstil egenskaben FørOpdatering i formularen frmAccounts til følgende hændelsesprocedure:

    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. Klik på menuen fejlfindingsamle < navnet på databasen >

  10. Hvis der ikke opstår fejl, kan du gemme formularen.

  11. Åbn formularen frmAccounts og tilføje en ny post eller redigere en post.

    Når du foretager en ændring i en post, gemmes posten, når du flytter til en anden post. Hvis der opstår en ODBC-fejl, skal du se den brugerdefinerede meddelelse, der er baseret på den server-specifikke fejl, og den generisk "ODBC: kaldet mislykkedes" er lukket inde meddelelse.

Udvid dine Office-færdigheder
Gå på opdagelse i kurser
Få nye funktioner først
Bliv Office Insider

Var disse oplysninger nyttige?

Tak for din feedback!

Tak for din feedback! Det lyder, som om det vil kunne hjælpe, hvis du bliver sat i forbindelse med en af vores Office-supportteknikere.

×