Office
Přihlásit se

Nelze zachycení chyb konkrétní ODBC PřiChybě vlastnosti formuláře (KB 206175)

Poznámka: Snažíme se pro vás co nejrychleji zajistit aktuální obsah nápovědy ve vašem jazyce. Tato stránka byla přeložena automaticky a může obsahovat gramatické chyby nebo nepřesnosti. Naším cílem je to, aby pro vás byl její obsah užitečný. Mohli byste nám prosím dát ve spodní části této stránky vědět, jestli vám informace v článku pomohly? Pokud byste se rádi podívali na jeho anglickou verzi, najdete ji tady.

Nastavte vlastnost PřiChybě formuláře aplikace Access do neobsahuje žádné záznamy nelze načíst popis chyby ODBC v tomto postupu popsaný dál a také nelze zachycení specifickou chybu ODBC. Když dojde k chybě rozhraní ODBC pouze informace, které se předávají funkcím neobsahuje chyby je číslo obecné chyby, například 3146, která odpovídá chybová zpráva: volání ODBC selhalo.

Příčina

Rozhraní ODBC chybové zprávy běžným způsobem sestávat ze dvou částí. První je chyba 3146, jejichž popis:

Volání ODBC se nezdařila.

Informace o chybě specifické pro server jsou obsaženy v druhé složky, ze kterého můžete načtete číslo chyby a popis jako:

[Microsoft] [Ovladač ODBC SQL serveru] – SQL Server < specifické pro Server chybová zpráva > (#< číslo chyby >)

Je-li nastavit vlastnost PřiChybě formuláře do neobsahuje žádné záznamy zachycení číslo první komponenty chyby do schránky, ale nemůžete zachycení počet druhé složky. Informace o serveru jednotlivých v druhé části Chyba ODBC se zobrazí na obrazovce po kód dokončení systém, pokud zahrnete následující řádek v případě postup:

Odpověď = acDataErrContinue

Řešení

Poznámka: Microsoft poskytuje ukázky programování pro obrázek, bez vyjádřený ani předpokládanou záruku. Zahrnutí, ale není omezena na předpokládanou záruk obchodovatelnosti nebo vhodnosti pro konkrétní účel. V tomto článku se předpokládá, že máte zkušenosti s programovacím jazykem, který je předmětem ukázky a pomocí nástrojů, které se používají k vytvoření a ladění postupy. Pracovníci technické podpory společnosti Microsoft můžete vysvětlit funkce určitého postupu, ale nemohou tyto příklady rozšířit o další funkce nebo konstrukce podle specifických požadavků.

Můžete vytvořit Microsoft Visual Basic for Applications proceduru, která používá objekty DAO (Data Access Objects) aktualizujte RecordsetClone , který je založený na formuláři. Umožňuje provádět zachycení chybová zpráva, která se zobrazí.

Rozhraní DAO obsahuje kolekci chyby, které lze použít k zachycení informace specifické pro server v druhé části Chyba ODBC. Když dojde k chybě rozhraní ODBC první složky uložené v první prvek kolekci chyby a druhé složky se ukládá do druhého prvek.

Příklad v tomto článku používá události před aktualizací místo událost chyby na konkrétní chyby ODBC. Pokud chcete vytvořit funkci, která přesahy konkrétní chyby ODBC, dojde k události před aktualizací formuláře, postupujte takto:

  1. Vytvoření prázdná databáze plochy.

  2. Odkaz na tabulce dbo_Accounts v ukázkové databázi AdventureWorks v Microsoft SQL Server.

  3. Pomocí Průvodce formulářem - sloupcovém rozložení k vytvoření nového formuláře založený na tabulce účty.

  4. Uložení formuláře jako frmAccounts.

  5. Vytvořte nový modul a potom zadejte následující řádek oddíl deklarací Pokud tento řádek ještě není:

    Možnost explicitní

  6. Zadejte nebo vložte do modulu následujícím způsobem:

    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žte modulu s jedinečný název a zavřete okno.

  8. Nastavte vlastnost před aktualizací frmAccounts formuláře následující neobsahuje žádné záznamy:

    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 nabídce ladění klepněte v < název databáze >

  10. Pokud dojde k bezchybné, uložte formulář.

  11. Otevřete formulář frmAccounts přidat nový záznam a úprava záznamu.

    Při provádění změn na se záznamem je záznam uložen při přechodu na jiný záznam. Pokud dojde k chybě rozhraní ODBC, uvidíte vlastní zprávu založený na serveru konkrétní chyby a obecný "ODBC – neúspěšné volání" zachycení zprávy.

Rozšiřte své dovednosti s Office
Projít školení
Získejte nové funkce jako první
Připojte se k účastníkům programu Office Insiders

Byly tyto informace užitečné?

Děkujeme vám za zpětnou vazbu.

Děkujeme vám za váš názor. Vypadá to, že bude užitečné, když vás spojíme s některým z našich agentů z podpory Office.

×