Nie je možné zachytiť špecifické ODBC chýb v PriChybe vlastnosť formulára (KB 206175)

Poznámka: Radi by sme vám čo najrýchlejšie poskytovali najaktuálnejší obsah Pomocníka vo vašom vlastnom jazyku. Táto stránka bola preložená automaticky a môže obsahovať gramatické chyby alebo nepresnosti. Naším cieľom je, aby bol tento obsah pre vás užitočný. Dali by ste nám v dolnej časti tejto stránky vedieť, či boli pre vás tieto informácie užitočné? Tu nájdete anglický článok pre jednoduchú referenciu.

Ak nastavíte vlastnosť PriChybe formulára programu Access na procedúru udalosti, nie je možné načítať Popis ODBC chyba pri tomto postupe a budete tiež nie je možné zachytiť konkrétnej chyby ODBC. Keď sa vyskytne chyba ODBC, jediné informácie, ktoré prechádza chyby udalosť postup je počet všeobecnom chybovom, ako je napríklad 3146, ktorá zodpovedá chybové hlásenie: zlyhala ODBC hovorov.

Príčina

ODBC chybové hlásenia obvykle skladá z dvoch častí. Prvá súčasť je chyba 3146, ktorých Popis je:

Volanie ODBC zlyhalo

Informácie o chybe servera špecifické je obsiahnutá v druhej zložky, z ktorej si budete môcť číslo chyby a popis, ako napríklad:

[Microsoft] [Ovládač ODBC SQL Server] [SQL Server] < servera špecifické chybové hlásenie > (#< chybové číslo >)

Ak nastavíte vlastnosť PriChybe formulára udalosť postup, môžete zachytiť čísla prvej zložky chyby, ale nie je možné zachytiť počet druhej zložky. Informácie špecifické pre server v druhej časti chyba ODBC sa zobrazí na obrazovke po kód spustený, kým tento riadok v prípade postupu:

Odpoveď = acDataErrContinue

Riešenie

Poznámka: Spoločnosť Microsoft poskytuje príklady programovacieho iba, bez záruky vyjadrené alebo implicitné. To zahŕňa, ale nie je obmedzené na implicitných záruk obchodovateľnosti alebo vhodnosti pre konkrétny účel. Tento článok predpokladá, že ste oboznámení s programovací jazyk, ktorý je čo dokazuje ich a nástroje, ktoré sa používajú na vytváranie a ladenie procedúr. Pracovníci technickej podpory spoločnosti Microsoft môžu pomôcť vysvetliť funkčnosť konkrétny postup, ale nemôžu tieto príklady poskytovať pridanú funkčnosť alebo postaviť postupy pre splnenie vašich konkrétnych požiadaviek.

Môžete vytvoriť Microsoft Visual Basic for Applications postup, ktorý používa Data Access Objects (DAO) aktualizujte RecordsetClone , ktorý je založený na formulári. Umožňuje zachytiť žiadne chybové hlásenie, ktoré dostávate.

DAO obsahuje chyby kolekcie, ktoré môžete použiť na zachytenie informácie špecifické pre server v druhej časti chyba ODBC. Keď sa vyskytne chyba ODBC, prvej zložky je uložený v prvý prvok kolekcie chýb a druhej zložky je uložený v druhý prvok.

Príklad v tomto článku používa PredAktualizáciou namiesto udalosť chyby môžete zachytiť konkrétnych chybách ODBC. Ak chcete vytvoriť funkciu, ktorá zachytí konkrétnych chybách ODBC, keď sa vyskytne PredAktualizáciou formulára, postupujte nasledovne:

  1. Vytvorenie prázdna Počítačová databáza.

  2. Prepojenie na tabuľku dbo_Accounts vo vzorovej databáze AdventureWorks Microsoft SQL Server.

  3. Pomocou Sprievodcu formulárom - stĺpcovej rozloženia a vytvoriť nový formulár založený na tabuľke kontá.

  4. Uložte formulár ako frmAccounts.

  5. Vytvoriť nový modul, a potom zadajte nasledujúci riadok v sekcii vyhlásenia, ak tento riadok ešte nie je k dispozícii:

    Option Explicit

  6. Zadajte alebo prilepte nasledujúci postup do modulu:

    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. Uložiť modulu s jedinečný názov a zatvorte okno modul.

  8. Nastavenie PredAktualizáciou formulára frmAccounts na udalosť nasledovne:

    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. V ponuke ladenie kliknite na tlačidlo zostaviť < názov databázy >

  10. Ak sa žiadne chyby, uložte formulár.

  11. Otvorte frmAccounts formulár, a potom pridajte nový záznam alebo úprava záznamu.

    Keď vykonáte zmeny v zázname, keď prejdete na iný záznam sa záznam uloží. Ak sa vyskytne chyba ODBC, sa zobrazí správu, ktorá je založený na serveri chybou a všeobecný "ODBC – volanie zlyhalo" správu je zachytený.

Rozšírte svoje zručnosti práce s balíkom Office
Preskúmať školenie
Buďte medzi prvými, ktorí získajú nové funkcie
Pridajte sa k insiderom pre Office

Boli tieto informácie užitočné?

Ďakujeme za vaše pripomienky!

Ďakujeme vám za pripomienky. Pravdepodobne vám pomôže, ak vás spojíme s pracovníkom podpory pre Office.

×