Nije moguće hvata određene ODBC pogreške u svojstvu OnError obrasca (KB 206175)

Napomena: Željeli bismo vam pružiti najnoviji sadržaj pomoći što je brže moguće i to na vašem jeziku. Ova je stranica strojno prevedena te može sadržavati gramatičke pogreške ili netočnosti. Naša je namjera da vam ovaj sadržaj bude koristan. Možete li nam pri dnu ove stranice javiti jesu li vam ove informacije bile korisne? Kao referencu možete pogledati i članak na engleskom jeziku.

Ako postavite svojstvo OnError obrasca programa Access na procedura događaja, nije moguće dohvatiti opis pogreške ODBC iz tog postupka, a ne da hvatanje i određene ODBC pogreška. Kada se pojavi pogreška ODBC, samo podaci koji se prenosi procedura događaja pogreške je broj generički pogreške, kao što su 3146, koji odgovara poruka o pogrešci: ODBC poziv nije uspjelo.

Uzrok

Poruka o pogrešci ODBC obično se sastoje od dviju komponenata. Prva komponenta je pogreška 3146, čije opis:

ODBC poziv nije uspio

Informacije o pogrešci specifične za poslužitelj je sadržan u druga komponenta iz kojeg možete dohvatiti broja pogreške i opis kao što su:

[Microsoft] [ODBC upravljački program SQL poslužitelj] [SQL Server] < poruka o pogrešci specifične za poslužitelja > (#< broj pogreške >)

Ako postavite svojstvo OnError obrasca na procedura događaja, možete prekriva broj prvi komponente pogreške, ali ne prekriva broj drugi komponente. Informacije specifične za poslužitelj u drugom dijelu ODBC pogreška se pojavljuje na zaslonu nakon kod je završio pokrenut, osim ako ih umetnete sljedeći redak u događaja postupak:

Odgovor = acDataErrContinue

Razlučivost

Napomena: Microsoft pruža primjere programiranja samo, radi ilustracije bez izražen ili implicitnih. To obuhvaća, ali nije ograničena, IMPLICITNA JAMSTVA korištenje ili tjelovježbe za određenu svrhu. U ovom se članku pretpostavlja da ste upoznati s programski jezik koji se koristi u primjeru i alate koji se koriste za stvaranje i postupke za ispravljanje pogrešaka. Microsoftovi inženjeri za podršku mogu objasniti funkciju određenog postupka, ali ne mogu mijenjati te primjere da bi ponudili funkcije niti prilagođavati postupke vašim potrebama.

Možete stvoriti Microsoft Visual Basic for Applications postupak koji koristi objekte pristupa podacima (DAO) da biste ažurirali RecordsetClone koji se temelji na obrascu. Omogućuje prekriva koje primite poruku o pogrešci.

DAO sadrži zbirku programa pogrešaka koje možete koristiti za hvatanje informacije specifične za poslužitelj u drugom dijelu ODBC pogreška. Kada se pojavi pogreška ODBC, prva komponenta pohranjena u prvi element zbirke pogrešaka , a druga komponenta pohranjena u drugi element.

Primjer u ovom članku koristi događaj BeforeUpdate umjesto događaj pogreške za hvatanje ODBC pogreške. Da biste stvorili funkcija koji prekriva konkretnim pogreškama ODBC kada se pojavi događaj BeforeUpdate obrasca, slijedite ove korake:

  1. Stvorite praznu bazu podataka radne površine.

  2. Veza na tablici dbo_Accounts u oglednu bazu podataka AdventureWorks u Microsoft SQL Server.

  3. Pomoću čarobnjaka za obrasce - stupčastu raspored da biste stvorili novi obrazac temeljen na tablici računa.

  4. Spremite obrazac kao frmAccounts.

  5. Stvorite novi modul, a zatim upišite sljedeći redak u odjeljak s deklaracijama ako taj redak već nije ondje:

    Mogućnost eksplicitnih

  6. Upišite ili zalijepite sljedeći postupak modula:

    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. Spremite modul jedinstveni naziv i zatvorili prozor modul.

  8. Postavite svojstvo BeforeUpdate frmAccounts obrasca na događaj u nastavku:

    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. Na izborniku za ispravljanje pogrešaka kliknite Prevedi < naziv baze podataka >

  10. Ako dođe do pogreške, spremite obrazac.

  11. Otvorite obrazac frmAccounts i dodavanje novog zapisa ili uređivanje zapisa.

    Kada unesete promjene zapisa, zapis je spremljena kada Premjesti na drukčiji zapisu. Ako dođe do pogreške ODBC, pročitajte članak s prilagođenom porukom koji se temelji na pogreške specifične za poslužitelj i na generički "ODBC--poziv nije uspio" je naišli poruke.

Proširite svoje vještine korištenja sustava Office
Istražite osposobljavanje

Jesu li vam ove informacije bile korisne?

Hvala vam na povratnim informacijama!

Hvala vam na povratnim informacijama! Čini se da bi vam pomoglo kad bismo vas povezali s nekim od naših agenata podrške za Office.

×