Nije moguće pronašli određene ODBC greške u OnError svojstva obrasca (KB 206175)

Napomena: Želimo da vam što pre pružimo najnoviji sadržaj pomoći čim na vašem jeziku. Ova stranica je prevedena automatski i može da sadrži gramatičke greške ili netačnosti. Naš cilj je da ovaj sadržaj bude koristan. Možete li nam na dnu ove stranice saopštiti da li su vam informacije bile od koristi? Ovo je članak na engleskom jeziku za brzu referencu.

Ako postavite svojstvo OnError Access obrasca za proceduru događaja, ne možete da preuzmete opis ODBC greške u tu proceduru, a takođe mogu da pronašli određene ODBC greške. Kada dođe do greške ODBC, samo informacije koje se prosleđuju greške nijedan zapis je broj generički grešku, kao što su 3146, koji odgovara na poruku o grešci: ODBC poziva nije uspelo.

Uzrok

ODBC poruke o grešci se sastoji od dve komponente. Prva komponenta je greška 3146, čiji opis je:

ODBC poziva nije uspelo

Informacije o grešci specifične za server se nalazi u drugoj komponenti sa koje možete da preuzmete broj greške i opis kao što su:

[Microsoft] [ODBC SQL Server upravljački program] [SQL Server] < poruku o grešci specifične za Server > (#< broj greške >)

Ako postavite svojstvo OnError obrasca za proceduru događaja, možete da zatvorite broj prve komponente greške, ali ne možete da zatvorite broj druga komponenta. Server specifične informacije u drugom delu ODBC greška se pojavljuje na ekranu kada kôd završi pokrenut, osim ako ne uključite sledeći red u slučaju proceduru:

Odgovor = acDataErrContinue

Rezolucija

Napomena: Microsoft pruža primere programiranja samo radi ilustracije, bez garancija ili podrazumevane. Ovo uključuje, ali nije ograničeno na podrazumevane garancije o prikladnosti za određenu svrhu. Ovaj članak pretpostavlja da ste upoznati sa programskog jezika koji se prikazuje i alatke koje se koriste za kreiranje i otklanjanja procedure. Microsoft podrška inženjera može da objasni funkcionalnost određene procedure, ali oni neće menjati ove primere da biste obezbedili dodatne funkcije ili kreirati procedure da sa vašim specifičnim zahtevima.

Možete da kreirate Microsoft Visual Basic for Applications proceduru koji koristi podatke Access objekti (DAO) da biste ažurirali RecordsetClone koja je zasnovana na obrascu. Ovo vam omogućava da pronašli poruku o grešci koju ste primili.

DAO sadrži kolekcije na grešaka koje možete da koristite da biste pronašli servera specifične informacije u drugom delu ODBC greška. Kada dođe do greške ODBC, prva komponenta je uskladištena u prvi element kolekcije grešaka , a druga komponenta je uskladištena u drugi element.

Na primer u ovom članku koristi BeforeUpdate događaj umesto greške događaj da biste pronašli određene ODBC greške. Da biste kreirali funkciju koja hvata određene ODBC greške kada dođe do događaja BeforeUpdate obrasca, sledite ove korake:

  1. Kreirajte praznu bazu podataka na radnoj površini.

  2. Veza ka dbo_Accounts tabelu u bazi podataka uzorka AdventureWorks u Microsoft SQL Server.

  3. Koristite čarobnjak za obrasce – stubasta raspored da biste kreirali novi obrazac zasnovan na tabeli nalozi.

  4. Čuvanje obrasca kao frmAccounts.

  5. Kreirajte novi modul, a zatim otkucajte sledeći red u odeljak deklaracija ako to već nije tamo:

    Opcija eksplicitno

  6. Otkucajte ili nalepite sledeću proceduru u modul:

    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. Sačuvajte modul sa jedinstvenim imenom i zatvorite prozor modul.

  8. Postavite svojstvo BeforeUpdate frmAccounts obrasca na sledeću proceduru događaja:

    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. Otklanjanje grešaka u meniju izaberite stavku Prevedi < ime baze podataka >

  10. Ako dođe do grešaka, sačuvajte obrazac.

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

    Kada izvršite promene u zapisu, zapis se čuva kada pređete na drugi zapis. Ako dođe do greške ODBC, videćete prilagođene poruku koja je zasnovana na serveru određene greške, a na generički „ODBC--poziv nije uspeo” poruka je zatvoren.

Razvijte Office veštine
Istražite obuku
Prvi nabavite nove funkcije
Pridružite se Office Insider korisnicima

Da li su vam ove informacije koristile?

Hvala vam na povratnim informacijama!

Hvala za povratne informacije! Zvuči da će biti od pomoći ako vas povežemo sa našim agentima Office podrške.

×