I try to limit the database size to 2MB by the following code, but it doesn't work, Could somebody help me on it?
Thanks a lot!
Part of my code is:
VariantInit(&dbprop[0].vValue);
VariantInit(&dbprop[1].vValue);
VariantInit(&dbprop[2].vValue);
VariantInit(&dbprop[3].vValue);
// Create an instance of the OLE DB Provider
//
hr = CoCreateInstance( CLSID_SQLSERVERCE_3_0,
0,
CLSCTX_INPROC_SERVER,
IID_IDBInitialize,
(void**)&pIDBInitialize);
if(FAILED(hr))
{
goto Exit;
}
// Initialize a property with name of database
//
dbprop[0].dwPropertyID = DBPROP_INIT_DATASOURCE;
dbprop[0].dwOptions = DBPROPOPTIONS_REQUIRED;
dbprop[0].vValue.vt = VT_BSTR;
dbprop[0].vValue.bstrVal = SysAllocString( DATABASE_LOG );
if(NULL == dbprop[0].vValue.bstrVal)
{
hr = E_OUTOFMEMORY;
goto Exit;
}
// Initialize property with open mode for database
dbprop[1].dwPropertyID = DBPROP_INIT_MODE;
dbprop[1].dwOptions = DBPROPOPTIONS_REQUIRED;
dbprop[1].vValue.vt = VT_I4;
dbprop[1].vValue.lVal = DB_MODE_READ | DB_MODE_WRITE;
// Set max database size
dbprop[2].dwPropertyID = DBPROP_SSCE_MAX_DATABASE_SIZE;
dbprop[2].dwOptions = DBPROPOPTIONS_REQUIRED;
dbprop[2].vValue.vt = VT_I4;
dbprop[2].vValue.lVal = 2; // 2MB
// set max size of temp. database file to 2MB
dbprop[3].dwPropertyID = DBPROP_SSCE_TEMPFILE_MAX_SIZE;
dbprop[3].dwOptions = DBPROPOPTIONS_REQUIRED;
dbprop[3].vValue.vt = VT_I4;
dbprop[3].vValue.lVal = 2; // 2MB
// Initialize the property set
//
dbpropset[0].guidPropertySet = DBPROPSET_DBINIT;
dbpropset[0].rgProperties = dbprop;
dbpropset[0].cProperties = sizeof(dbprop)/sizeof(dbprop[0]);
// Get IDBDataSourceAdmin interface
//
hr = pIDBInitialize->QueryInterface(IID_IDBDataSourceAdmin, (void **) &pIDBDataSourceAdmin);
if(FAILED(hr))
{
goto Exit;
}
// Create and initialize data store
//
hr = pIDBDataSourceAdmin->CreateDataSource( 1, dbpropset, NULL, IID_IUnknown, &pIUnknownSession);
if(FAILED(hr))
{
goto Exit;
}
"Max database size" does not set a limit on the physical size of the sdf file. See http://blogs.msdn.com/sqlservercompact/archive/2007/06/13/the-story-of-max-database-size-connection-string-parameter.aspx
I think there may be a minimum value, which is probably more than 2.
|||Your SSCE props need to be in a seperate propset as follows:
Code Block
DBPROPSET dbpropset[2]; // Property Set used to initialize provider
DBPROP dbprop[1]; // property array set to initialize provider
DBPROP sscedbprop[4]; // Property array for SSCE properties
//Initialize variants
VariantInit(&dbprop[0].vValue);
VariantInit(&sscedbprop[0].vValue);
VariantInit(&sscedbprop[1].vValue);
VariantInit(&sscedbprop[2].vValue);
VariantInit(&sscedbprop[3].vValue);
// Initialize a property with name of database
dbprop[0].dwPropertyID = DBPROP_INIT_DATASOURCE;
dbprop[0].dwOptions = DBPROPOPTIONS_REQUIRED;
dbprop[0].vValue.vt = VT_BSTR;
dbprop[0].vValue.bstrVal = SysAllocString(a_pwszName);
if(NULL == dbprop[0].vValue.bstrVal)
{
hr = E_OUTOFMEMORY;
goto _ExitCreate;
}
// Initialize the first property set.
dbpropset[0].guidPropertySet = DBPROPSET_DBINIT;
dbpropset[0].rgProperties = dbprop;
dbpropset[0].cProperties = sizeof(dbprop)/sizeof(dbprop[0]);
sscedbprop[0].dwPropertyID = DBPROP_SSCE_AUTO_SHRINK_THRESHOLD;
sscedbprop[0].dwOptions = DBPROPOPTIONS_REQUIRED;
sscedbprop[0].vValue.vt = VT_I4;
sscedbprop[0].vValue.intVal = 100;
sscedbprop[1].dwPropertyID = DBPROP_SSCE_MAX_DATABASE_SIZE;
sscedbprop[1].dwOptions = DBPROPOPTIONS_REQUIRED;
sscedbprop[1].vValue.vt = VT_I4;
sscedbprop[1].vValue.intVal = 4091;
if(a_pwszPass!=NULL)
{
// Specify the property for encryption.
sscedbprop[2].dwPropertyID = DBPROP_SSCE_ENCRYPTDATABASE;
sscedbprop[2].dwOptions = DBPROPOPTIONS_REQUIRED;
sscedbprop[2].vValue.vt = VT_BOOL;
sscedbprop[2].vValue.boolVal = (a_bEncrypted==TRUE)?VARIANT_TRUE:VARIANT_FALSE;
// Specify the password.
sscedbprop[3].dwPropertyID = DBPROP_SSCE_DBPASSWORD;
sscedbprop[3].dwOptions = DBPROPOPTIONS_REQUIRED;
sscedbprop[3].vValue.vt = VT_BSTR;
sscedbprop[3].vValue.bstrVal = SysAllocString(a_pwszPass);
if(NULL == sscedbprop[3].vValue.bstrVal)
{
hr = E_OUTOFMEMORY;
goto _ExitCreate;
}
}
else if(a_bEncrypted)
{
hr = E_INVALIDARG;
CHKHR(hr, L"Encrypted databases require a password", _ExitCreate);
}
dbpropset[1].guidPropertySet = DBPROPSET_SSCE_DBINIT ;
dbpropset[1].rgProperties = sscedbprop;
dbpropset[1].cProperties = sizeof(sscedbprop)/sizeof(sscedbprop[0]) - ((a_pwszPass==NULL)?2:0);
// Get IDBDataSourceAdmin interface
hr = m_pIDBInitialize->QueryInterface(IID_IDBDataSourceAdmin, (void **) &m_pIDBDataSourceAdmin);
CHKHR(hr, L"Failed to obtain IDBDataSourceAdmin interface", _ExitCreate);
// Create and initialize data store
hr = m_pIDBDataSourceAdmin->CreateDataSource(sizeof(dbpropset)/sizeof(dbpropset[0]), dbpropset, NULL, IID_IUnknown, &m_pIUnknownSession);
CHKHR(hr, L"Failed to create data source", _ExitCreate);
// Clear Variants
VariantClear(&dbprop[0].vValue);
VariantClear(&sscedbprop[0].vValue);
VariantClear(&sscedbprop[1].vValue);
VariantClear(&sscedbprop[2].vValue);
VariantClear(&sscedbprop[3].vValue);
Notice how dbpropset[1].guidPropertySet = DBPROPSET_SSCE_DBINIT instead of DBPROPSET_DBINIT
|||Thanks a lot Erik! the link is very helpful, and after testing, i found the minimum size for SQL CE is 16MB.|||Thanks a lot J Shaddix! after using DBPROPSET_SSCE_DBINIT instead of DBPROPSET_DBINIT
, the max size limitation works! and i found the minimum size for SQL CE is 16MB.
|||Good to know about the min size, thanks!
No comments:
Post a Comment