Ne peut pas détecter les erreurs ODBC spécifique dans SurErreur propriété d’un formulaire (206175 Ko)

Remarque : Nous faisons de notre mieux pour vous fournir le contenu d’aide le plus récent aussi rapidement que possible dans votre langue. Cette page a été traduite automatiquement et peut donc contenir des erreurs grammaticales ou des imprécisions. Notre objectif est de faire en sorte que ce contenu vous soit utile. Pouvez-vous nous indiquer en bas de page si ces informations vous ont aidé ? Voici l’article en anglais à des fins de référence aisée.

Si vous définissez la propriété SurErreur d’un formulaire Access à une procédure événementielle, vous ne pouvez pas récupérer la description d’une erreur ODBC dans cette procédure, et vous ne pouvez pas également recouvrir une erreur ODBC spécifique. Lorsqu’une erreur ODBC se produit, la seule information qui est passée à la procédure événementielle Error est le nombre d’une erreur générique, tels que 3146, qui correspond au message d’erreur : appel ODBC a échoué.

Cause

Messages d’erreur ODBC se composent normalement de deux composants. Le premier composant est erreur 3146, dont la description :

Échec de l’appel ODBC

Les informations d’erreur spécifiques au serveur sont contenues dans le deuxième composant, à partir duquel vous pouvez extraire un numéro d’erreur et une description telles que :

[Microsoft] [Pilote ODBC SQL Server] [SQL Server] < message d’erreur spécifiques au serveur > (#< numéro d’erreur >)

Si vous définissez la propriété SurErreur d’un formulaire à une procédure événementielle, vous pouvez recouvrir le numéro du premier composant de l’erreur, mais vous ne pouvez pas recouvrir le numéro du second composant. Les informations spécifiques au serveur dans la deuxième partie de l’erreur ODBC s’affiche dans l’écran après que le code cesse de s’exécuter, sauf si vous incluez la ligne suivante de l’événement procédure :

Réponse = acDataErrContinue

Résolution

Remarque : Microsoft fournit des exemples de programmation d’illustration uniquement, sans garantie ou implicite. Cela inclut, mais n’est pas limité à, les garanties implicites de qualité ou d’adéquation à un usage particulier. Cet article suppose que vous êtes familiarisé avec le langage de programmation présenté et les outils qui sont utilisées pour créer et déboguer des procédures. Ingénieurs du support technique Microsoft peuvent vous expliquer les fonctionnalités d’une procédure particulière, mais ils ne peuvent pas modifier ces exemples pour fournir des fonctionnalités supplémentaires ou créer des procédures répondant à vos besoins spécifiques.

Vous pouvez créer un Microsoft procédure Visual Basic pour Applications qui utilise des objets DAO (Data Access) pour mettre à jour un RecordsetClone basé sur le formulaire. Cela vous permet d’intercepter les messages d’erreur que vous recevez.

DAO contient un ensemble d’erreurs que vous pouvez utiliser pour intercepter les informations spécifiques au serveur dans la deuxième partie de l’erreur ODBC. Lorsqu’une erreur ODBC se produit, le premier élément est stocké dans le premier élément de la collection d’erreurs, et le second composant est stocké dans le deuxième élément.

L’exemple de cet article utilise l’événement Avant MAJ au lieu de l’événement d’erreur pour intercepter des erreurs ODBC spécifiques. Pour créer une fonction qui recouvre les erreurs ODBC spécifiques lors de l’événement Avant MAJ d’un formulaire se produit, procédez comme suit :

  1. Créer une base de données vide.

  2. Créer un lien vers la table dbo_Accounts dans la base de données exemple AdventureWorks dans Microsoft SQL Server.

  3. Utilisez l’Assistant formulaire - disposition en colonnes pour créer un nouveau formulaire basé sur la table de comptes.

  4. Enregistrez le formulaire en tant que frmAccounts.

  5. Créer un nouveau module et tapez la ligne suivante dans la section Déclarations si cette ligne n’est déjà fait :

    Option explicite

  6. Tapez ou collez la procédure suivante dans le 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. Enregistrez le module avec un nom unique et fermez la fenêtre de module.

  8. Définissez la propriété Avant MAJ du formulaire frmAccounts sur la procédure événementielle suivante :

    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. Dans le menu Déboguer, cliquez sur Compiler < nom de votre base de données >

  10. Si aucune erreur se produit, enregistrez le formulaire.

  11. Ouvrez le formulaire frmAccounts, puis ajouter un nouvel enregistrement ou modifier un enregistrement.

    Lorsque vous modifiez un enregistrement, l’enregistrement est enregistré lorsque vous passez à un autre enregistrement. Si une erreur ODBC se produit, vous voyez le message personnalisé qui est basé sur l’erreur spécifiques au serveur, et le générique « ODBC--l’appel a échoué » message est détectée.

Développez vos compétences dans Office
Découvrez des formations
Accédez aux nouvelles fonctionnalités en avant-première
Rejoignez le programme Office Insider

Ces informations vous ont-elles été utiles ?

Nous vous remercions pour vos commentaires.

Merci pour vos commentaires. Il serait vraisemblablement utile pour vous de contacter l’un de nos agents du support Office.

×