INTELLIGENT WORK FORUMS
FOR COMPUTER PROFESSIONALS

Log In

Come Join Us!

Are you a
Computer / IT professional?
Join Tek-Tips Forums!
  • Talk With Other Members
  • Be Notified Of Responses
    To Your Posts
  • Keyword Search
  • One-Click Access To Your
    Favorite Forums
  • Automated Signatures
    On Your Posts
  • Best Of All, It's Free!

*Tek-Tips's functionality depends on members receiving e-mail. By joining you are opting in to receive e-mail.

Posting Guidelines

Promoting, selling, recruiting, coursework and thesis posting is forbidden.

Jobs

Visual Basic (Microsoft) Versions 5/6 FAQ

Database

Using/Inspecting ADO Error information by TomKane
Posted: 10 Jun 03

SUMMARY
When ActiveX Data Objects (ADO) encounter an error, often the Errors Collection is filled with details on the cause of the error. This article provides sample code for extracting the maximum possible information on any errors raised by ADO using Visual Basic.

If ADO itself encounters an error, it does not populate the Errors Collection, but instead you have to use a native error mechanism to catch and display the error, in this case the Visual Basic Err object. If the provider or underlying components generate error, then these will be populated in the ADO Errors Collection. So you need to check both the Visual Basic Error object and the ADO Errors Collection. However, you may want to preserve the values of the Err collection, because if you Error handling is too complex, in the process of examining and displaying the Errors collection, you could end up resetting the Err object.
MORE INFORMATION
The documentation for the ADO Error object indicates that the Errors Collection will be populated if any error occurs within ADO or it's underlying provider. This is somewhat incorrect. Depending on the source of the error, or even bug, in the underlying provider to ADO (OLE-DB) or within ADO itself, the errors collection may not be populated. You need to check both the Visual Basic Error object as well as the ADO Errors collection.

The Errors Collection is only available from the Connection object, so you need to initialize ADO off of a Connection object. Following is sample code that demonstrates how to open a connection and report any errors encountered.

Often the Errors Collection returns an HRESULT in either hexadecimal format (for example, 0x80004005) or as a long value (for example, 2147467259). These HRESULTS can be raised by underlying components such as OLE-DB or even OLE itself. When this is the case, it may be confusing since these codes are not documented in the ADO online documentation. However, frequently encountered HRESULTS can be found in the Microsoft Knowledge Base article listed in the REFERENCES section.
Private Sub cmdTemplate_Click()

   Dim Conn1 As Connection
   Dim Errs1 As Errors
   Dim i As Integer
   Dim StrTmp

   On Error GoTo AdoError

   Set Conn1 = CreateObject("ADODB.Connection")

   ' Open connection to Bogus ODBC Data Source for BIBLIO.MDB
   Conn1.ConnectionString = "DBQ=BIBLIO.MDB;" & _
              "DRIVER={Microsoft Access Driver (*.mdb)};" & _
              "DefaultDir=C:\Bogus\Directory\Path;" & _
              "UID=admin;PWD=;"
   Conn1.Open

   ' Remaining code goes here.

   Done:

   ' Close all open objects.
     If Conn1.State = adStateOpen Then
        Conn1.Close
      End If

   ' Destroy anything not destroyed yet.
     Set Conn1 = Nothing

   ' We're done.
     Exit Sub

   AdoError:

      Dim errLoop As Error
      Dim strError As String

      i = 1

   ' Process
     StrTmp = StrTmp & vbCrLf & "VB Error # " & Str(Err.Number)
     StrTmp = StrTmp & vbCrLf & "   Generated by " & Err.Source
     StrTmp = StrTmp & vbCrLf & "   Description  " & Err.Description

   ' Enumerate Errors collection and display properties of
   ' each Error object.
     Set Errs1 = Conn1.Errors
     For Each errLoop In Errs1
          With errLoop
            StrTmp = StrTmp & vbCrLf & "Error #" & i & ":"
            StrTmp = StrTmp & vbCrLf & "   ADO Error   #" & .Number
            StrTmp = StrTmp & vbCrLf & "   Description  " & .Description
            StrTmp = StrTmp & vbCrLf & "   Source       " & .Source
            i = i + 1
       End With
    Next

      MsgBox StrTmp

      ' Clean up Gracefully

      On Error Resume Next
      GoTo Done

   End Sub

Back to Visual Basic (Microsoft) Versions 5/6 FAQ Index
Back to Visual Basic (Microsoft) Versions 5/6 Forum

My Archive

Resources

Close Box

Join Tek-Tips® Today!

Join your peers on the Internet's largest technical computer professional community.
It's easy to join and it's free.

Here's Why Members Love Tek-Tips Forums:

Register now while it's still free!

Already a member? Close this window and log in.

Join Us             Close