欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

【SQL Server CE2.0】创建加密的数据库(源代码)

程序员文章站 2022-05-19 19:10:16
...

HRESULThr = NOERROR; DBPROPSETdbpropset[2]; DBPROPdbprop[1]; // Property array to initialize the provider. DBPROPsscedbprop[2]; // Property array for SSCE security properties INTi = 0; IDBDataSourceAdmin*pIDBDataSourceAdmin = NULL; IUnknow

HRESULT hr = NOERROR;
DBPROPSET dbpropset[2];
DBPROP dbprop[1]; // Property array to initialize the provider.
DBPROP sscedbprop[2]; // Property array for SSCE security properties
INT i = 0;
IDBDataSourceAdmin *pIDBDataSourceAdmin = NULL;
IUnknown *pIUnknownSession = NULL;
IDBInitialize *pIDBInitialize = NULL;

// Create an instance of the OLE DB provider.
hr = CoCreateInstance(CLSID_SQLSERVERCE_2_0, 0, CLSCTX_INPROC_SERVER,
IID_IDBInitialize, (void**)&pIDBInitialize);
if(FAILED(hr))
{
RETAILMSG(1,(TEXT("1==CoCreateInstance: %d /r/n"),GetLastError()));
goto CleanExit;
}

// Initialize property structures.
VariantInit(&dbprop[0].vValue);
for (i = 0; i {
VariantInit(&sscedbprop[i].vValue);
}

// Leo:To create a new database, you must specify the DBPROP_INIT_DATASOURCE property to
// specify a name for the database.
dbprop[0].dwPropertyID = DBPROP_INIT_DATASOURCE;
dbprop[0].dwOptions = DBPROPOPTIONS_REQUIRED;
dbprop[0].vValue.vt = VT_BSTR;
dbprop[0].vValue.bstrVal = SysAllocString(L"Encrypted.sdf");
if(NULL == dbprop[0].vValue.bstrVal)
{
hr = E_OUTOFMEMORY;
goto CleanExit;
}

// Specify the property for encryption.
sscedbprop[0].dwPropertyID = DBPROP_SSCE_ENCRYPTDATABASE;
sscedbprop[0].dwOptions = DBPROPOPTIONS_REQUIRED;
sscedbprop[0].vValue.vt = VT_BOOL;
sscedbprop[0].vValue.boolVal = VARIANT_TRUE;

// Specify the password.
sscedbprop[1].dwPropertyID = DBPROP_SSCE_DBPASSWORD;
sscedbprop[1].dwOptions = DBPROPOPTIONS_REQUIRED;
sscedbprop[1].vValue.vt = VT_BSTR;
sscedbprop[1].vValue.bstrVal = SysAllocString(L"123456"); //密码
if(NULL == sscedbprop[1].vValue.bstrVal)
{
hr = E_OUTOFMEMORY;
goto CleanExit;
}

// Initialize the property sets.
dbpropset[0].guidPropertySet = DBPROPSET_DBINIT;
dbpropset[0].rgProperties = dbprop;
dbpropset[0].cProperties = sizeof(dbprop)/sizeof(dbprop[0]);

dbpropset[1].guidPropertySet = DBPROPSET_SSCE_DBINIT ;
dbpropset[1].rgProperties = sscedbprop;
dbpropset[1].cProperties = sizeof(sscedbprop)/sizeof(sscedbprop[0]);

hr = pIDBInitialize->QueryInterface(IID_IDBDataSourceAdmin,(void **)&pIDBDataSourceAdmin);
if(FAILED(hr))
{
RETAILMSG(1,(TEXT("1==pIDBInitialize->QueryInterface: %d /r/n"),hr));
goto CleanExit;
}

// Create and initialize the database.
hr = pIDBDataSourceAdmin->CreateDataSource(sizeof(dbpropset)/sizeof(dbpropset[0]),
dbpropset, NULL, IID_IUnknown, &pIUnknownSession);
if(FAILED(hr))
{
RETAILMSG(1,(TEXT("1==pIDBDataSourceAdmin->CreateDataSource: %d /r/n"),hr));
goto CleanExit;
}
// At this point, the new encrypted database is created.

leanExit:
VariantClear(&dbprop[0].vValue);
SysFreeString(dbprop[0].vValue.bstrVal);

for(i = 0;i {
VariantClear(&sscedbprop[i].vValue);
}

// Do cleanup tasks here.
if(NULL != pIDBDataSourceAdmin)
{
pIDBDataSourceAdmin->Release();
pIDBDataSourceAdmin = NULL;
}
if(NULL != pIDBInitialize)
{
pIDBInitialize->Release();
pIDBInitialize = NULL;
}
if(NULL != pIUnknownSession)
{
pIUnknownSession->Release();
pIUnknownSession = NULL;
}

return;