Kan geen vangen specifieke ODBC-fouten in BijFout eigenschap van een formulier (KB 206175)

Opmerking: We willen u graag zo snel mogelijk de meest recente Help-inhoud in uw eigen taal bieden. Deze pagina is automatisch vertaald en kan grammaticale fouten of onnauwkeurigheden bevatten. Wij hopen dat deze inhoud nuttig voor u is. Kunt u ons onder aan deze pagina laten weten of de informatie nuttig voor u was? Hier is het Engelstalige artikel ter referentie.

Als u de eigenschap BijFout van een Access-formulier aan een gebeurtenisprocedure instelt, kunt u de beschrijving van een ODBC-fout in deze procedure niet ophalen en niet kunt u ook een specifieke ODBC-fout onderscheppen. Wanneer een ODBC-fout optreedt, is de enige informatie die wordt doorgegeven aan de gebeurtenisprocedure fout het aantal een algemene fout, zoals 3146, dat met het foutbericht overeenkomt: ODBC-oproep is mislukt.

Oorzaak

ODBC-foutberichten bestaan gewoonlijk uit twee onderdelen. Het eerste onderdeel is fout 3146, waarvan u de beschrijving is:

ODBC-oproep is mislukt

Gegevens van de server-specifieke fout is opgenomen in het tweede onderdeel, van waaruit u een foutnummer en een beschrijving zoals kunt ophalen:

[Microsoft] [ODBC SQL Server-stuurprogramma] SQL Server < foutbericht Server / regiospecifieke > (#< foutnummer >)

Als u de eigenschap BijFout van een formulier aan een gebeurtenisprocedure instelt, kunt u het nummer van het eerste onderdeel van de fout onderscheppen, maar u kunt het nummer van het tweede onderdeel kan niet overlappen. De server-specifieke informatie in het tweede deel van de ODBC-fout wordt weergegeven op het scherm nadat de code is voltooid actief is, tenzij u de volgende regel in het logboek opnemen procedure:

Antwoord = acDataErrContinue

Resolutie

Opmerking: Microsoft verstrekt programming voorbeelden uitsluitend ter illustratie impliciete of. Dit omvat, maar het is niet beperkt tot, het impliciete garanties van verhandelbaarheid of geschiktheid voor een bepaald doel. In dit artikel wordt ervan uitgegaan dat u bekend met de programmeertaal die wordt wordt gedemonstreerd en met de hulpmiddelen die worden gebruikt om te maken en bent voor foutopsporing procedures. Microsoft-ondersteuningsmedewerkers kunnen uitleg over de functie van een bepaalde procedure, maar ze worden niet in deze voorbeelden om te bieden extra functionaliteit of uw specifieke vereisten desgewenst wijzigen.

U kunt een Microsoft Visual Basic for Applications-procedure waarin Data Access Objects (DAO) wordt gebruikt voor het bijwerken van een RecordsetClone die is gebaseerd op het formulier maken. Hiermee kunt u een foutbericht wordt weergegeven die u ontvangt overlappen.

DAO bevat een siteverzameling van fouten die u gebruiken kunt om op te vangen van de server-specifieke informatie in het tweede deel van de ODBC-fout. Wanneer een ODBC-fout optreedt, het eerste onderdeel is opgeslagen in het eerste element van de verzameling fouten en het tweede onderdeel is opgeslagen in het tweede element.

Het voorbeeld in dit artikel wordt de gebeurtenis voor bijwerken in plaats van de gebeurtenis fout onderscheppen van specifieke ODBC-fouten. Als u wilt een functie waarmee specifieke ODBC-fouten als de gebeurtenis voor bijwerken van een formulier maakt, de volgende stappen uit:

  1. Maak een lege bureaubladdatabase.

  2. Koppeling naar de tabel dbo_Accounts in de voorbeelddatabase AdventureWorks in Microsoft SQL Server.

  3. Gebruik de Wizard formulier - kolommen indeling te maken van een nieuw formulier maken op basis van de tabel accounts.

  4. Sla het formulier als frmAccounts.

  5. Maak een nieuwe module en typt u de volgende regel in de sectie declaraties als deze regel nog niet aanwezig:

    Option Explicit

  6. Typ of plak de volgende procedure in de 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. Sla de module met een unieke naam en sluit het modulevenster.

  8. Stel de eigenschap voor bijwerken van het formulier frmAccounts op de volgende gebeurtenisprocedure:

    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 op het menu Foutopsporing op < naam van uw database > compileren

  10. Als er geen fouten optreden, sla het formulier.

  11. Open het formulier frmAccounts en klikt u vervolgens een nieuwe record toevoegen of bewerken van een record.

    Wanneer u een wijziging in een record aanbrengt, wordt de record wordt opgeslagen wanneer u naar een andere record. Als een ODBC-fout optreedt, ziet u het aangepaste bericht die is gebaseerd op de server-specifieke fout, en de algemene "ODBC: aanroep mislukt' bericht wordt onderschept.

Uw Office-vaardigheden uitbreiden
Training verkennen
Als eerste nieuwe functies krijgen
Deelnemen aan Office Insiders

Was deze informatie nuttig?

Bedankt voor uw feedback.

Hartelijk dank voor uw feedback! Het lijkt ons een goed idee om u in contact te brengen met een van onze Office-ondersteuningsagents.

×