title: "Persisted Data Source Objects | Microsoft Docs" ms.custom: "" ms.date: "03/14/2017" ms.prod: "sql" ms.prod_service: "database-engine, sql-database, sql-data-warehouse, pdw" ms.service: "" ms.component: "native-client-ole-db-data-source-objects" ms.reviewer: "" ms.suite: "sql" ms.technology:
ms.tgt_pltfrm: "" ms.topic: "reference" helpviewer_keywords:
- "OLE DB data source objects [SQL Server Native Client]"
- "data source objects [OLE DB]"
- "SQL Server Native Client OLE DB provider, persisted data source objects"
- "persisted data source objects" ms.assetid: dfdacc81-42fe-4f20-8969-bed1f743defe caps.latest.revision: 29 author: "MightyPen" ms.author: "genemi" manager: "craigg" ms.workload: "Inactive" monikerRange: ">= aps-pdw-2016 || = azuresqldb-current || = azure-sqldw-latest || >= sql-server-2016 || = sqlallproducts-allversions"
[!INCLUDEappliesto-ss-asdb-asdw-pdw-md] [!INCLUDESNAC_Deprecated]
The [!INCLUDEssNoVersion] Native Client OLE DB provider supports persisted data source objects with the IPersistFile interface.
A. Persist data source initialization:
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(aSSInitProps[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:
This example uses a persisted data source object with additional initialization properties that provide a [!INCLUDEssNoVersion] login 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 a valid data source specification is persisted.