Det går inte att fånga in specifika ODBC-fel i VidFel egenskap för ett formulär (KB 206175)

Obs!: Vi vill kunna erbjuda dig bästa möjliga supportinnehåll så fort som möjligt och på ditt språk. Den här sidan har översatts med hjälp av automatiserad översättning och kan innehålla grammatiska fel eller andra felaktigheter. Vår avsikt är att den här informationen ska vara användbar för dig. Vill du berätta för oss om informationen är till hjälp längst ned på sidan? Här är artikeln på engelska som referens.

Om du anger egenskapen VidFel för ett Access-formulär till en händelseprocedur, du kan inte hämta beskrivning av ODBC-fel i den proceduren och även kan inte hitta ett specifikt ODBC-fel. När ett ODBC-fel inträffar kan endast informationen som skickas till händelseprocedur fel är antalet ett allmänt fel, till exempel 3146, som motsvarar felmeddelandet: ODBC-anrop misslyckades.

Orsak

ODBC-felmeddelanden består normalt av två delar. Den första komponenten är fel 3146, vars beskrivning är:

ODBC-anrop misslyckades

Server-specifikt felinformation finns i den andra komponenten, som du kan hämta en felkod och en beskrivning som:

[Microsoft] [Drivrutin för ODBC SQL Server] [SQL Server] < Server-specifika felmeddelande > (#< felnummer >)

Om du anger egenskapen VidFel för ett formulär till en händelseprocedur du kan hitta numret på den första delen av felet, men du kan inte hitta numret på den andra komponenten. Server-specifik information i den andra delen av ODBC-fel visas på skärmen när koden har körts, såvida du inte tar följande rad i proceduren:

Svar = acDataErrContinue

Upplösning

Obs!: Microsoft tillhandahåller programmeringsexempel endast, utan några uttryckliga eller implicit. Detta omfattar, men är inte begränsat till garantier angående säljbarhet eller lämplighet för ett särskilt syfte. I den här artikeln förutsätter att du är bekant med det programmeringsspråk som demonstreras och de verktyg som används för att skapa och felsöka procedurer. Microsofts tekniker kan hjälpa till att förklara funktionaliteten hos en viss procedur, men kan inte ändra dessa exempel för att ge ytterligare funktioner eller skapa procedurer som motsvarar dina krav.

Du kan skapa ett Microsoft Visual Basic for Applications-procedur som använder Data Access Objects (DAO) för att uppdatera RecordsetClone som baseras på formuläret. Gör att du vill hitta ett felmeddelande som du tar emot.

DAO innehåller ett fel samling som du kan använda för att hitta server-specifik information i den andra delen av ODBC-fel. När ett ODBC-fel inträffar komponenten första lagras i det första elementet i samlingen fel och den andra komponenten lagras i andra element.

Exemplet i den här artikeln används händelsen före uppdatering i stället för händelsen fel för att hitta specifika ODBC-fel. Gör följande om du vill skapa en funktion som svälls specifika ODBC-fel när händelsen före uppdatering av ett formulär inträffar:

  1. Skapa en tom skrivbordsdatabas.

  2. Länk till tabellen dbo_Accounts i exempeldatabasen AdventureWorks i Microsoft SQL Server.

  3. Använda Formulärguiden - kolumnlayout du skapar ett nytt formulär som baseras på tabellen konton.

  4. Spara formuläret som frmAccounts.

  5. Skapa en ny modul och Skriv följande rad i avsnittet deklarationer om raden inte redan finns där:

    Option Explicit

  6. Skriv eller klistra in följande procedur i modulen:

    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. Spara modulen med ett unikt namn och Stäng modulfönstret.

  8. Ange egenskapen före uppdatering i formuläret frmAccounts till följande händelseprocedur:

    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. Klicka på Felsök-menyn Kompilera < namnet på databasen >

  10. Spara formuläret om inga fel uppstår.

  11. Öppna formuläret frmAccounts och lägga till en ny post eller redigera en post.

    När du gör en ändring i en post sparas posten när du flyttar till en annan post. Om det uppstår en ODBC-fel du ser det anpassade meddelandet som baseras på fel server-specifika och det allmänna ”ODBC: anrop misslyckades” meddelande fångas.

Utöka dina Office-kunskaper
Utforska utbildning
Få nya funktioner först
Anslut till Office Insiders

Hade du nytta av den här informationen?

Tack för din feedback!

Tack för din feedback! Det låter som att det kan vara bra att koppla dig till en av våra Office-supportrepresentanter.

×