MDAC 2.5 SDK - OLE DB Programmer's Reference
Chapter 2: Data Source and Session Objects


 

Enumerator Example

The code in this example shows how to create and use an enumerator object.

/////////////////////////////////////////////////////////////////
// myCreateEnumerator
//
// This function creates an enumerator, obtains a sources rowset
// from it, displays the rowset to the user, and allows the user
// to specify the ProgID of a provider. The CLSID that matches
// this ProgID is retuned to the caller in *pCLSID.
//
/////////////////////////////////////////////////////////////////
HRESULT myCreateEnumerator
   (
   REFCLSID             clsidEnumerator,
   CLSID *              pCLSID
   )
{
   HRESULT              hr;
   IUnknown *           pIUnkEnumerator               = NULL;
   ISourcesRowset *     pISourcesRowset               = NULL;
   IRowset *            pIRowset                      = NULL;
   IDBInitialize *      pIDBInitialize                = NULL;
   WCHAR                wszProgID[MAX_NAME_LEN + 1]   = {0};
   
   const ULONG          cProperties                   = 2;
   DBPROP               rgProperties[cProperties];
   DBPROPSET            rgPropSets[1];

   // Create the enumerator object. We ask for IUnknown when creating
   // the enumerator because some enumerators may require initialization
   // before we can obtain a sources rowset from the enumerator. This is
   // indicated by whether or not the enumerator object exposes 
   // IDBInitialize. (We don't want to ask for IDBInitialize, since 
   // enumerators that don't require initialization will cause the 
   // CoCreateInstance to fail.)
   XCHECK_HR(hr = CoCreateInstance(
            clsidEnumerator,            // clsid--enumerator
            NULL,                       // pUnkOuter
            CLSCTX_INPROC_SERVER,       // dwClsContext
            IID_IUnknown,               // riid
            (void**)&pIUnkEnumerator));  // ppvObj
            
   // If the enumerator exposes IDBInitialize, we need to initialize it.
   if( SUCCEEDED(hr = pIUnkEnumerator->QueryInterface(IID_IDBInitialize, 
      (void**)&pIDBInitialize)) )
   {
      CHECK_HR(hr = myDoInitialization(pIUnkEnumerator));
   }

   // Set properties on the rowset, to request additional functionality.
   myAddRowsetProperties(rgPropSets, cProperties, rgProperties);

   // Obtain a sources rowset from the enumerator. This rowset contains
   // all of the OLE DB providers that this enumerator is able to list.
   XCHECK_HR(hr = pIUnkEnumerator->QueryInterface(IID_ISourcesRowset,
             (void**)&pISourcesRowset));
   XCHECK_HR(hr = pISourcesRowset->GetSourcesRowset(
             NULL,                    // pUnkOuter
             IID_IRowset,             // riid
             1,                       // cPropSets
             rgPropSets,              // rgPropSets
             (IUnknown**)&pIRowset));  // ppRowset      

   // Display the rowset to the user. This will allow the user to
   // perform basic navigation of the rowset and will allow the user
   // to select a row containing a desired provider.
   CHECK_HR(hr = myDisplayRowset(pIRowset, 
            L"SOURCES_NAME", MAX_NAME_LEN, wszProgID));

   // Obtain the ProgID for the provider to use from the user.
   // The default value for this is the value of the SOURCES_NAME
   // column in the row selected by the user previously.
   myGetInputFromUser(wszProgID, L"\nType the ProgID of a provider"
                      L" to use [Enter = `%s`]: ", wszProgID);
   XCHECK_HR(hr = CLSIDFromProgID(wszProgID, pCLSID));

CLEANUP:
   if( pIUnkEnumerator )
      pIUnkEnumerator->Release();
   if( pISourcesRowset )
      pISourcesRowset->Release();
   if( pIRowset )
      pIRowset->Release();
   if( pIDBInitialize )
      pIDBInitialize->Release();
   return hr;
}