Searching/Listing Items (ADO)

Topic Last Modified: 2006-06-12

Example

Visual Basic

Note

The following example uses a file URL with the Exchange OLE DB (ExOLEDB) provider. The ExOLEDB provider also supports The HTTP: URL Scheme. Using The HTTP: URL Scheme allows both client and server applications to use a single URL scheme.

'Searching/Listing Items Using ADO
'This sample shows how to search objects.
'
'Make reference to the ADO 2.5 library.
'Make reference to Active DS Type Library.
Private Sub SearchItems()

   On Error GoTo Errorhandler

   Dim strDomainName As String
   Dim strUser As String

   Dim strPathOfSourceFolder As String
   Dim strSourceFolderUrl As String
   Dim strSearchSql As String

   ' Specify the domain and user.
   strDomainName = GetDomainDNSName()

   ' Note: the user must exist for this sample to work.
   strUser = "user1"

   ' Sample 1: List Appointments in Calendar
   strPathOfSourceFolder = "MBX/" & strUser & "/Calendar"

   strSourceFolderUrl = "file://./backofficestorage/" & _
   strDomainName & "/" & strPathOfSourceFolder

   ' Create the SQL query for the recordset (appointments).
   strSearchSql = "select "
   strSearchSql = strSearchSql & " ""urn:schemas:mailheader:content-class"""
   strSearchSql = strSearchSql & ", ""DAV:href"""
   strSearchSql = strSearchSql & ", ""DAV:displayname"""
   strSearchSql = strSearchSql & ", ""DAV:isfolder"""
   strSearchSql = strSearchSql & ", ""DAV:iscollection"""
   strSearchSql = strSearchSql & ", ""urn:schemas:httpmail:subject"""
   strSearchSql = strSearchSql & " from scope ('shallow traversal of " & Chr(34)
   strSearchSql = strSearchSql & strSourceFolderUrl & """') "
   strSearchSql = strSearchSql & " WHERE ""DAV:ishidden"" = false"
   strSearchSql = strSearchSql & " AND ""DAV:isfolder"" = false"

   Call SearchListObjects(strDomainName, strPathOfSourceFolder, strSearchSql)


   ' Sample 2: List Contacts in Ccontacts.
   strPathOfSourceFolder = "MBX/" & strUser & "/Contacts"

   strSourceFolderUrl = "file://./backofficestorage/" & _
   strDomainName & "/" & strPathOfSourceFolder

   ' Create the SQL query for the recordset (appointments).
   strSearchSql = "select "
   strSearchSql = strSearchSql & " ""urn:schemas:mailheader:content-class"""
   strSearchSql = strSearchSql & ", ""DAV:href"""
   strSearchSql = strSearchSql & ", ""DAV:displayname"""
   strSearchSql = strSearchSql & ", ""DAV:isfolder"""
   strSearchSql = strSearchSql & ", ""DAV:iscollection"""
   strSearchSql = strSearchSql & ", ""urn:schemas:httpmail:subject"""
   strSearchSql = strSearchSql & " from scope ('shallow traversal of " & Chr(34)
   strSearchSql = strSearchSql & strSourceFolderUrl & """') "
   strSearchSql = strSearchSql & " WHERE ""DAV:ishidden"" = false"
   strSearchSql = strSearchSql & " AND ""DAV:isfolder"" = false"

   ' Call SearchListObjects(strDomainName, strPathOfSourceFolder, strSearchSql).


   ' Sample 3: List Travel all subfolders of MBX under the user
   'strPathOfSourceFolder = "MBX/" & strUser

   strPathOfSourceFolder = "MBX/" & strUser & "/Deleted Items"

   strSourceFolderUrl = "file://./backofficestorage/" & _
   strDomainName & "/" & strPathOfSourceFolder

   ' Create the SQL query for the recordset (appointments).
   strSearchSql = "select "
   strSearchSql = strSearchSql & " ""urn:schemas:mailheader:content-class"""
   strSearchSql = strSearchSql & ", ""DAV:href"""
   strSearchSql = strSearchSql & ", ""DAV:displayname"""
   strSearchSql = strSearchSql & ", ""DAV:isfolder"""
   strSearchSql = strSearchSql & ", ""DAV:iscollection"""
   strSearchSql = strSearchSql & " from scope ('shallow traversal of " & Chr(34)
   strSearchSql = strSearchSql & strSourceFolderUrl & """') "
   strSearchSql = strSearchSql & " WHERE ""DAV:ishidden"" = false"

   ' This can be omitted.
   strSearchSql = strSearchSql & " AND ""DAV:isfolder"" = true"
   strSearchSql = strSearchSql & " AND ""DAV:iscollection"" = true"

   Call SearchListObjects(strDomainName, strPathOfSourceFolder, strSearchSql)

   GoTo Ending

   Errorhandler:

   Debug.Print "Error: " + Str(Err.Number) + " " + Err.Description
   Err.Clear

   Ending:

End Sub


Private Sub SearchListObjects(strDomainName As String, strLocalPathOfSourceFolder As String, strSearchSql As String)
   Dim Rec As New ADODB.Record
   Dim Rst As New ADODB.Recordset
   Dim strSourceFolderUrl As String

   ' Set the URL to the location of the folder.
   strSourceFolderUrl = "file://./backofficestorage/" & _
   strDomainName & "/" & strLocalPathOfSourceFolder

   ' Open the record.
   Rec.Open strSourceFolderUrl, , adModeReadWrite 'Move needs parameter adModeReadWrite

   ' Open recordset - a list of objects.
   Rst.Open strSearchSql, Rec.ActiveConnection

   ' Check to see if any objects were found.
   If Rst.RecordCount = 0 Then
      Debug.Print "No objects found!"
      Exit Sub
   End If

   ' Some objects have been found.
   Rst.MoveFirst
   Do While Not Rst.EOF

   Dim strObjectUrl As String
   Dim strContentClass As String

   ' Retrieve some properties.
   strObjectUrl = Rst.Fields("DAV:href")
   strContentClass = Rst.Fields("urn:schemas:mailheader:content-class")
   Debug.Print "ContectClass : " & strContentClass

   If Rst.Fields("DAV:iscollection") = True Then
      Debug.Print "FolderName : " & Rst.Fields("DAV:displayname")

      ' Retrieve the Folder Type property.
      Dim iFolder As New CDO.Folder
      iFolder.DataSource.Open strObjectUrl

      Debug.Print "FolderType : " & iFolder.Fields("https://schemas.microsoft.com/exchange/outlookfolderclass") & vbLf

      Set iFolder = Nothing
   Else
      Select Case strContentClass
         Case "urn:content-classes:message"
            Dim iMessage As New CDO.Message
            iMessage.DataSource.Open strObjectUrl

            ' Display some properties.
            Debug.Print "Message" & vbLf & _
            "Sender: " & iMessage.Sender & vbLf & _
            "Subject: " & iMessage.Subject & vbLf & _
            "DateRecdeived: " & iMessage.ReceivedTime & vbLf & vbLf

            Set iMessage = Nothing

         Case "urn:content-classes:person"
            Dim iPerson As New CDO.Person
            iPerson.DataSource.Open strObjectUrl

            ' Display some properties.
            Debug.Print "Person" & vbLf & _
            "First Name: " & iPerson.FirstName & vbLf & _
            "Last Name: " & iPerson.LastName & vbLf & _
            "Title: " & iPerson.Title & vbLf & _
            "Company: " & iPerson.Company & vbLf & vbLf

            Set iPerson = Nothing

         Case "urn:content-classes:appointment"
            Dim iAppointment As New CDO.Appointment
            iAppointment.DataSource.Open strObjectUrl

            ' Display some properties.
            Debug.Print "Appointment" & vbLf & _
            "Subject: " & iAppointment.Subject & vbLf & _
            "Location: " & iAppointment.Location & vbLf & _
            "StartTime: " & iAppointment.StartTime & vbLf & _
            "EndTime: " & iAppointment.EndTime & vbLf & vbLf

            Set iAppointment = Nothing

         Case Else
            Debug.Print "The case :" & strContentClass & " is not included here"
      End Select

   End If

   Rst.MoveNext
   Loop

   ' Close the connections.
   Rst.Close
   Rec.Close

   ' Clean up.
   Set Rst = Nothing
   Set Rec = Nothing

End Sub


Private Function GetDomainDNSName() As String
   Dim Info As New ADSystemInfo
   Dim strDomain As String
   strDomain = Info.DomainDNSName

   GetDomainDNSName = strDomain
End Function