Persisted Data Source Objects

OLE DB and SQL Server

OLE DB and 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 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™ 2000 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.