MDAC 2.5 SDK - OLE DB Providers
OLE DB Provider for SQL Server


 

Persisted Data Source Objects

SQLOLEDB supports persisted data source objects with the IPersistFile interface.

Examples

A. Persist data source initialization properties

This example shows a function that persists data source initialization properties defining a server, database, and the use of the Windows NT Authentication Mode for connection. The server name and database name are received in the pLocation and pDatasource parameters of the function.

HRESULT SetAndSaveInitProps
   (
   IDBInitialize* pIDBInitialize,
   WCHAR* pDataSource,
   WCHAR* pCatalog,
   BOOL bUseWinNTAuth
   )
   {
      const ULONG      nProps = 4;
      ULONG            nSSProps;
      ULONG            nPropSets;
      ULONG            nProp;
      IDBProperties*   pIDBProperties  = NULL;
      IPersistFile*    pIPersistFile   = NULL;
      DBPROP           aInitProps[nProps];
      DBPROP*          aSSInitProps    = NULL;
      DBPROPSET*       aInitPropSets   = NULL;
      HRESULT          hr;

      nSSProps = 0;
      nPropSets = 1;

      aInitPropSets = new DBPROPSET[nPropSets];

      // Initialize common property options.
      for (nProp = 0; nProp < nProps; nProp++)
         {
            VariantInit(&aInitProps[nProp].vValue);
            aInitProps[nProp].dwOptions = DBPROPOPTIONS_REQUIRED;
            aInitProps[nProp].colid = DB_NULLID;
         }

      // Level of prompting that will be done to complete the connection
      // process.
      aInitProps[0].dwPropertyID = DBPROP_INIT_PROMPT;
      aInitProps[0].vValue.vt = VT_I2;
      aInitProps[0].vValue.iVal = DBPROMPT_NOPROMPT;     

      // Server name.
      aInitProps[1].dwPropertyID = DBPROP_INIT_DATASOURCE;    
      aInitProps[1].vValue.vt = VT_BSTR;
      aInitProps[1].vValue.bstrVal = SysAllocString(pDataSource);

      // Database.
      aInitProps[2].dwPropertyID = DBPROP_INIT_CATALOG;
      aInitProps[2].vValue.vt = VT_BSTR;
      aInitProps[2].vValue.bstrVal = SysAllocString(pCatalog);

      aInitProps[3].dwPropertyID = DBPROP_AUTH_INTEGRATED;
      if (bUseWinNTAuth == TRUE)
      {
         aInitProps[3].vValue.vt = VT_BSTR;
         aInitProps[3].vValue.bstrVal = SysAllocString(L"SSPI");
      } // End if

      // Now that properties are set, construct the PropertySet array.
      aInitPropSets[0].guidPropertySet = DBPROPSET_DBINIT;
      aInitPropSets[0].cProperties = nProps;
      aInitPropSets[0].rgProperties = aInitProps;

      // Set initialization properties.
      pIDBInitialize->QueryInterface(IID_IDBProperties,
         (void**) &pIDBProperties);
      hr = pIDBProperties->SetProperties(nPropSets, aInitPropSets);
      if (FAILED(hr))
      {
         // Display error from failed SetProperties.
      }
      pIDBProperties->Release();

      // Free references on OLE known strings.
      for (nProp = 0; nProp < nProps; nProp++)
      {
         if (aInitProps[nProp].vValue.vt == VT_BSTR)
            SysFreeString(aInitProps[nProp].vValue.bstrVal);
      }

      for (nProp = 0; nProp < nSSProps; nProp++)
      {
         if (aSSInitProps[nProp].vValue.vt == VT_BSTR)
            SysFreeString(aInitProps[nProp].vValue.bstrVal);
      }

      // Free dynamically allocated memory.
      delete [] aInitPropSets;
      delete [] aSSInitProps;

      // On success, persist the data source.
      if (SUCCEEDED(hr))
      {
         pIDBInitialize->QueryInterface(IID_IPersistFile,
         (void**) &pIPersistFile);

         hr = pIPersistFile->Save(OLESTR("MyDataSource.txt"), FALSE);

         if (FAILED(hr))
         {
            // Display errors from IPersistFile interface.
         }
         pIPersistFile->Release();
      }

      return (hr);
   }

B. Use persisted data source initialization properties

This example uses a persisted data source object with additional initialization properties that provide a Microsoft® SQL Server™ login ID and password.

HRESULT InitFromPersistedDS
   (
   IDBInitialize* pIDBInitialize,
   WCHAR* pPersistedDSN,
   WCHAR* pUID,
   WCHAR* pPWD
   )
   {
      //const ULONG    nProps = 3;
      const ULONG      nProps = 1;
      const ULONG      nPropSets = 1;
      ULONG            nProp;
      IDBProperties*   pIDBProperties = NULL;
      IPersistFile*    pIPersistFile = NULL;
      DBPROP           aInitProps[nProps];
      DBPROPSET        aInitPropSets[nPropSets];
      HRESULT          hr;

      // First load the persisted data source information.
      pIDBInitialize->QueryInterface(IID_IPersistFile,
         (void**) &pIPersistFile);

      hr = pIPersistFile->Load(pPersistedDSN, STGM_DIRECT);

      if (FAILED(hr))
      {
         // Display errors from IPersistFile interface.
      }
      pIPersistFile->Release();

      if (FAILED(hr))
      {
         return (hr);
      }

      // Initialize common property options.
      for (nProp = 0; nProp < nProps; nProp++)
      {
         VariantInit(&aInitProps[nProp].vValue);
         aInitProps[nProp].dwOptions = DBPROPOPTIONS_REQUIRED;
         aInitProps[nProp].colid = DB_NULLID;
      }

      // Level of prompting that will be done to complete the connection
      // process.
      aInitProps[0].dwPropertyID = DBPROP_INIT_PROMPT;
      aInitProps[0].vValue.vt = VT_I2;
      aInitProps[0].vValue.iVal = DBPROMPT_NOPROMPT; 

      // Now that properties are set, construct the PropertySet array.
      aInitPropSets[0].guidPropertySet = DBPROPSET_DBINIT;
      aInitPropSets[0].cProperties = nProps;
      aInitPropSets[0].rgProperties = aInitProps;

      // Set initialization properties.
      pIDBInitialize->QueryInterface(IID_IDBProperties,
         (void**) &pIDBProperties);
      hr = pIDBProperties->SetProperties(nPropSets, aInitPropSets);
      if (SUCCEEDED(hr))
      {
         hr = pIDBInitialize->Initialize();
         if (FAILED(hr))
         {
            DumpError(pIDBInitialize, IID_IDBInitialize);
         }
      }
      else
      {
         // Display error from failed SetProperties.
      }
      pIDBProperties->Release();

      // Free references on OLE known strings.
      for (nProp = 0; nProp < nProps; nProp++)
      {
         if (aInitProps[nProp].vValue.vt == VT_BSTR)
         SysFreeString(aInitProps[nProp].vValue.bstrVal);
      }

      return (hr);
   }

The IPersistFile::Save method can be called before or after calling IDBInitialize::Initialize. Calling the method after a successful return from IDBInitialize::Initialize ensures persisting a valid data source specification.