【SQL Server CE2.0】打开加密的数据库(源代码)
1 HRESULT hr; 2 DBID TableName; // name of table for new constraint 3 DBID ColumnList[1]; // name of column for new constraint 4 DBID ConstraintName; // name of new constraint 5 DBPROP dbprop[1]; 6 DBPROP sscedbprop[2]; // Property array for SSCE security properties 7 DBPROPSET dbpropset[2]; 8 DBCONSTRAINTDESC rgConstraintDescs[1]; // Structure for constraint properties 9 IDBInitialize *pIDBInitialize = NULL; 10 IDBProperties *pIDBProperties = NULL; 11 IDBCreateSession *pIDBCreateSession = NULL; 12 ITableDefinitionWithConstraints *pITbleDefWithConstrt = NULL; // supports adding constraints 13 int i = 0; 14 // Create an instance of the OLE DB Provider 15 hr = CoCreateInstance(CLSID_SQLSERVERCE_2_0, 0, CLSCTX_INPROC_SERVER, 16 IID_IDBInitialize, (void**)&pIDBInitialize); 17 if(FAILED(hr)) 18 { 19 RETAILMSG(1,(TEXT("2==CoCreateInstance failed: 0x%x/r/n"),hr)); 20 goto CleanExit; 21 } 22 // Initialize a property with name of database 23 // Open an exsiting database myDatabase 24 VariantInit(&dbprop[0].vValue); 25 for(i = 0;i < sizeof(sscedbprop) / sizeof(sscedbprop[0]);i++) 26 { 27 VariantInit(&sscedbprop[i].vValue); 28 } 29 dbprop[0].dwPropertyID = DBPROP_INIT_DATASOURCE; 30 dbprop[0].dwOptions = DBPROPOPTIONS_REQUIRED; 31 dbprop[0].vValue.vt = VT_BSTR; 32 dbprop[0].vValue.bstrVal = SysAllocString(L"Encrypted.sdf"); 33 // Specify the property for encryption. 34 sscedbprop[0].dwPropertyID = DBPROP_SSCE_ENCRYPTDATABASE; 35 sscedbprop[0].dwOptions = DBPROPOPTIONS_REQUIRED; 36 sscedbprop[0].vValue.vt = VT_BOOL; 37 sscedbprop[0].vValue.boolVal = VARIANT_TRUE; 38 // Specify the password. 39 sscedbprop[1].dwPropertyID = DBPROP_SSCE_DBPASSWORD; 40 sscedbprop[1].dwOptions = DBPROPOPTIONS_REQUIRED; 41 sscedbprop[1].vValue.vt = VT_BSTR; 42 sscedbprop[1].vValue.bstrVal = SysAllocString(L"123456"); //密码 43 if(NULL == sscedbprop[1].vValue.bstrVal) 44 { 45 hr = E_OUTOFMEMORY; 46 goto CleanExit; 47 } 48 // Initialize the property set 49 dbpropset[0].guidPropertySet = DBPROPSET_DBINIT; 50 dbpropset[0].rgProperties = dbprop; 51 dbpropset[0].cProperties = sizeof(dbprop)/sizeof(dbprop[0]); 52 dbpropset[1].guidPropertySet = DBPROPSET_SSCE_DBINIT; 53 dbpropset[1].rgProperties = sscedbprop; 54 dbpropset[1].cProperties = sizeof(sscedbprop)/sizeof(sscedbprop[0]); 55 //Set initialization properties. 56 hr = pIDBInitialize->QueryInterface(IID_IDBProperties, (void **)&pIDBProperties); 57 if(FAILED(hr)) 58 { 59 RETAILMSG(1,(TEXT("2==pIDBInitialize->QueryInterface failed: 0x%x/r/n"),hr)); 60 goto CleanExit; 61 } 62 // Sets properties in the Data Source and initialization property groups 63 hr = pIDBProperties->SetProperties(sizeof(sscedbprop) / sizeof(sscedbprop[0]), dbpropset); 64 if(FAILED(hr)) 65 { 66 RETAILMSG(1,(TEXT("2==pIDBProperties->SetProperties failed: 0x%x/r/n"),hr)); 67 goto CleanExit; 68 } 69 // Initializes a data source object 70 hr = pIDBInitialize->Initialize(); 71 if(FAILED(hr)) 72 { 73 RETAILMSG(1,(TEXT("2==pIDBInitialize->Initialize failed: 0x%x/r/n"),hr)); 74 goto CleanExit; 75 } 76 //只有已经创建表,以下操作才可能成功 77 hr = pIDBInitialize->QueryInterface(IID_IDBCreateSession,(void**)&pIDBCreateSession); 78 if(FAILED(hr)) 79 { 80 RETAILMSG(1,(TEXT("2==pIDBInitialize->QueryInterface failed: 0x%x/r/n"),hr)); 81 goto CleanExit; 82 } 83 // Create a session object. 84 hr = pIDBCreateSession->CreateSession(NULL, IID_ITableDefinitionWithConstraints, 85 (IUnknown**) &pITbleDefWithConstrt); 86 if(FAILED(hr)) 87 { 88 RETAILMSG(1,(TEXT("2==pIDBCreateSession->CreateSession failed: 0x%x/r/n"),hr)); 89 goto CleanExit; 90 } 91 // (This sample assumes that we have information about the TestTable table database schema.) 92 // Prepare the table name DBID as Employees. 93 TableName.eKind = DBKIND_NAME; 94 TableName.uName.pwszName = L"TestTable"; 95 // Prepare the list of columns that will get the UNIQUE constraint. 96 // In this case, just the iID column. 97 ColumnList[0].eKind = DBKIND_NAME; 98 ColumnList[0].uName.pwszName = L"iID"; 99 // Build the DBCONSTRAINTDESC structure needed to make the 100 // ITableDefinitionWithConstraints::AddConstraint 101 // call to add the constraint. 102 rgConstraintDescs[0].pConstraintID = &ConstraintName; 103 rgConstraintDescs[0].ConstraintType = DBCONSTRAINTTYPE_UNIQUE; 104 rgConstraintDescs[0].cColumns = 1; 105 rgConstraintDescs[0].rgColumnList = ColumnList; 106 rgConstraintDescs[0].Deferrability = 0; // SQL Server CE constraints are not deferrable. 107 // The following properties are not used in UNIQUE constraints 108 rgConstraintDescs[0].pReferencedTableID = NULL; 109 rgConstraintDescs[0].cForeignKeyColumns = 0; 110 rgConstraintDescs[0].rgForeignKeyColumnList = NULL; 111 rgConstraintDescs[0].pwszConstraintText = NULL; 112 rgConstraintDescs[0].UpdateRule = DBUPDELRULE_NOACTION; 113 rgConstraintDescs[0].DeleteRule = DBUPDELRULE_NOACTION; 114 rgConstraintDescs[0].MatchType = DBMATCHTYPE_NONE; 115 // Add the new constraint 116 hr = pITbleDefWithConstrt->AddConstraint(&TableName, rgConstraintDescs); 117 if(FAILED(hr)) 118 { //0x80040e37: Table does not exist. 119 RETAILMSG(1,(TEXT("2==pITbleDefWithConstrt->AddConstraint: 0x%x/r/n"),hr)); 120 goto CleanExit; 121 } 122 CleanExit: 123 VariantClear(&dbprop[0].vValue); 124 SysFreeString(dbprop[0].vValue.bstrVal); 125 for (i = 0; i < sizeof(sscedbprop) / sizeof(sscedbprop[0]); i++) 126 { 127 VariantClear(&sscedbprop[i].vValue); 128 } 129 if(NULL != pITbleDefWithConstrt) 130 { 131 pITbleDefWithConstrt->Release(); 132 pITbleDefWithConstrt = NULL; 133 } 134 if(NULL != pIDBCreateSession) 135 { 136 pIDBCreateSession->Release(); 137 pIDBCreateSession = NULL; 138 } 139 140 if(NULL != pIDBProperties) 141 { 142 pIDBProperties->Release(); 143 pIDBProperties = NULL; 144 } 145 if(NULL != pIDBInitialize) 146 { 147 pIDBInitialize->Release(); 148 pIDBInitialize = NULL; 149 }