Creating a Schema Rowset

This example creates a schema rowset that represents the dimensions schema. IDBSchemaRowset returns an IRowset interface pointer for the schema rowset.

//
HRESULT MDPSchemaSample(IDBSchemaRowset* pIDBSchemaRowset,
                        IUnknown** ppIUnknown)
{
   HRESULT hr;
   assert(*ppIUnknown == NULL);

   hr = pIUnknown->QueryInterface(IID_IDBSchemaRowset,
      (void **) &pIDBSchemaRowset);

   // Get a list of the schemas supported by the provider.
   GUID *rgSchemas = NULL;
   ULONG *rgRestrictionSupport = NULL;
   ULONG cSchemas;
   hr = pIDBSchemaRowset->GetSchemas( &cSchemas, &rgSchemas,
      &rgRestrictionSupport );

   // Create a rowset that represents the dimensions. Check whether
   // MDSCHEMA_DIMENSIONS is in the list returned by GetSchemas.
   ULONG cRestrictions = 0;
   BOOL bSchemaSupported = FALSE;
   for (ULONG i=0; i < cSchemas; i++)
   {
      if (rgSchemas[i] == MDSCHEMA_DIMENSIONS)
      {
         bSchemaSupported = TRUE;
         cRestrictions = rgRestrictionSupport[i];
      }
   }
   if (bSchemaSupported)
   {
      IDBCreateCommand *pIDBCreateCommand = NULL;
      VARIANT rgRestrictions[MAX_RESTRICTIONS];

      // Initialize the restrictions.
      for (ULONG j=0; j < cRestrictions; j++)
         VariantInit( &rgRestrictions[j] );

      rgRestrictions[CUBE_NAME].bstrVal = 
          SysAllocString(L"Video Store Sales");
      rgRestrictions[CUBE_NAME].vt = VT_BSTR;
      assert(rgRestrictions[CUBE_NAME].bstrVal);

      rgRestrictions[DIMENSION_NAME].bstrVal =
         SysAllocString( L"Customer Location");
      rgRestrictions[DIMENSION_NAME].vt = VT_BSTR;
      assert(rgRestrictions[DIMENSION_NAME].bstrVal);

      // Create a schema rowset for the "Customer Location" dimension.
      hr = pIDBSchemaRowset->GetRowset(NULL, MDSCHEMA_DIMENSIONS,
         cRestrictions, rgRestrictions, IID_IRowset, 0, NULL,
         (IUnknown **)ppIUnknown );

      // Free the restrictions.
      for (j=0; j < cRestrictions; j++)
         VariantClear(&rgRestrictions[j]);
   }

   if (rgSchemas) CoTaskMemFree(rgSchemas);
   if (rgRestrictionSupport) CoTaskMemFree(rgRestrictionSupport);
   if (pIDBSchemaRowset) pIDBSchemaRowset->Release();
   return hr;
}