Bir formun (KB 206175) HataDurumunda özelliğindeki belirli ODBC hataları yakalamak açamıyorum

Not: En güncel yardım içeriklerini, mümkün olduğunca hızlı biçimde kendi dilinizde size sunmak için çalışıyoruz. Bu sayfanın çevirisi otomasyon aracılığıyla yapılmıştır ve bu nedenle hatalı veya yanlış dil bilgisi kullanımları içerebilir. Amacımız, bu içeriğin sizin için faydalı olabilmesini sağlamaktır. Buradaki bilgilerin faydalı olup olmadığını bu sayfanın sonunda bize bildirebilir misiniz? Kolayca başvurabilmek için İngilizce makaleye buradan ulaşabilirsiniz.

Olay yordamı için bir Access formu HataDurumunda özelliğini ayarlarsanız, bu yordamdaki ODBC hata açıklaması alamıyor ve ayrıca belirli bir ODBC hata yakalamak yapamazsınız. ODBC hata oluştuğunda, hata olay yordama iletilen bilgiler yalnızca hata iletisi karşılık gelen genel bir hata, 3146 gibi numarasıdır: ODBC arama başarısız oldu.

Neden

ODBC hata iletileri normalde iki bileşenleri içerir. Hata açıklaması olan 3146, ilk bileşenidir:

ODBC araması başarısız oldu

Sunucu özgü hata bilgilerini içinden bir hata numarası ve açıklama gibi alabilir ikinci bileşeni yer alır:

[Microsoft] [ODBC SQL Server sürücüsü] [SQL Server] < sunucuya özel hata iletisi > (#< hata numarası >)

Bir formun HataDurumunda özelliği için olay yordamı ayarlarsanız, ilk bileşen hata sayısını yakalayabilir, ancak ikinci bileşen sayısını yakalamak yapamazsınız. Aşağıdaki satırı olay eklemediğiniz sürece kodun çalışmasını, bitirdikten sonra sunucu özgü bilgileri ODBC hata ikinci bölümündeki yordamı ekranda görüntülenir:

Yanıt acDataErrContinue =

Çözünürlük

Not: Microsoft programlama örneklerini yalnızca gösterim zımni veya garanti olmadan sağlar. Bu içerir, ancak, belirli bir amaca satılabilirlik veya zımni hiçbir garanti sınırlı değildir. Bu makalede gösterilen programlama dili ile ve oluşturmak ve Hata Ayıkla yordamlar için kullanılan araçlarıyla bilgi sahibi olduğunuzu varsayar. Microsoft destek mühendisler belirli bir yordam işlevselliğini açıklamaya yardımcı olabilir, ancak işlevsellik sağlamak veya gereksinimlerinizi karşılamak üzere yordamlar geliştirmek amacıyla bu örnekleri değiştirmez.

Microsoft Visual Basic for formu temel alan bir RecordsetClone güncelleştirmek için veri erişim nesneleri (DAO) kullanan uygulamalar yordamı oluşturabilirsiniz. Bu, aldığınız herhangi bir hata iletisi yakalamak sağlar.

DAO sunucu özgü bilgileri ODBC hata ikinci bölümündeki yakalamak için kullanabileceğiniz bir hataları koleksiyonu içerir. ODBC hata oluştuğunda, ilk bileşen hataları koleksiyonunun ilk öğe depolanır ve ikinci bileşen ikinci öğeye depolanır.

Bu makaledeki örneği BeforeUpdate olayı hata olayı yerine belirli ODBC hataları yakalamak için kullanır. Bir formun BeforeUpdate olayı oluştuğunda, belirli ODBC hataları yakalar bir işlev oluşturmak için şu adımları izleyin:

  1. Boş Masaüstü Veritabanı oluşturma.

  2. Microsoft SQL Server AdventureWorks örnek veritabanında dbo_Accounts tabloda bağlayın.

  3. Form Sihirbazı'nı - sütunlu Düzen hesapları tabloyu temel alan yeni bir form oluşturmak için kullanın.

  4. Formu frmAccounts kaydedin.

  5. Yeni bir modül oluşturun ve o satırdaki henüz yoksa tanımlamalar bölümüne şu satırı yazın:

    Açık seçeneği

  6. Yazın veya aşağıdaki yordamı modüle yapıştırın:

    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. Modülü benzersiz bir ad ile kaydedin ve modül penceresini kapatın.

  8. Aşağıdaki olay yordama frmAccounts formun BeforeUpdate özelliğini ayarlayın:

    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. Hata Ayıkla menüsünde, < veritabanınızı adını > derleme ' ı tıklatın.

  10. Hiçbir hataları oluşursa, formu kaydedin.

  11. FrmAccounts formunu açın ve sonra yeni bir kayıt ekleme veya kayıt düzenleyebilirsiniz.

    Kayda değişiklik yaptığınızda, farklı bir kayda taşıdığınızda kaydı kaydedilir. ODBC hata oluşursa, sunucu özgü hata üzerinde dayanır özel iletisi görüntülenir ve "arama yüklenemediği genel ODBC--" ileti yakalanan.

Office yeteneklerinizi geliştirin
Eğitimleri keşfedin
Yeni özellikleri ilk olarak siz edinin
Office Insider Programına Katılın

Bu bilgi yararlı oldu mu?

Görüşleriniz için teşekkür ederiz!

Geri bildiriminiz için teşekkürler! Office destek temsilcilerimizden biriyle görüşmeniz yararlı olabilir.

×