持久数据源对象

神通数据库 OLE DB数据源对象支持IPersistFile接口,通过这个接口,数据源信息可以写入磁盘。下面这个例子展示了一个持久化数据源初始化信息的函数,初始化信息包括服务器地址,数据库,用户名和密码。

HRESULT SetAndSaveInitProps

(

IDBInitialize* pIDBInitialize,

WCHAR* pDataSource,

WCHAR* pCatalog,

WCHAR* pUID,

WCHAR* pPWD

)

{

const ULONG nProps = 5;

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);

// User ID.

aInitProps[3].dwPropertyID = DBPROP_AUTH_USERID;

aInitProps[3].vValue.vt = VT_BSTR;

aInitProps[3].vValue.bstrVal = SysAllocString(pUID);

// Password.

aInitProps[4].dwPropertyID = DBPROP_INIT_PASSWORD;

aInitProps[4].vValue.vt = VT_BSTR;

aInitProps[4].vValue.bstrVal = SysAllocString(pPWD);

// 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.dat"),

FALSE);

if (FAILED(hr))

{

// Display errors from IPersistFile interface.

}

pIPersistFile->Release();

}

return (hr);

}

IPersistFile::Save方法可以在IDBInitialize::Initialize方法之前或者之后调用。在Initialize方法之后调用可以保证持久化的信息是正确的能够成功初始化的信息。