環境構築手順と問題解決
EVC4でダイアログベースプロジェクトを作成し、ボタンイベントにSQL CEのデータベース作成コードを実装する際の手順:
コンパイルエラー1: 未定義識別子
エラー内容: DBPROPSETなどの未定義エラー(全79件)
解決策: StdAfx.hに以下のヘッダを追加
#include <oledb.h>
#include <oledberr.h>
#include <coguid.h>
#include "ca_mergex20.h"
#include "ssceoledb.h" // DBPROPSET定義用
注意: CSDNの提案内容(DBINITCONSTANTSやINITGUIDの定義)は重複定義エラーを引き起こすため不要
LNK2005: IID_IUnknown already defined LNK1169: multiply defined symbols
コンパイルエラー2: ヘッダファイルの構文エラー
エラー内容: ssceoledb.h内の構文エラー
解決策: Microsoftサポートから最新のssceoledb.hをダウンロードし、インストールディレクトリのファイルを上書き
COM初期化の必要性
CoCreateInstance()失敗時はアプリケーションの初期化/終了処理でCOMを明示的に初期化:
CoInitializeEx(NULL, COINIT_MULTITHREADED);
// アプリケーション終了時に
CoUninitialize();
暗号化データベース作成実装
OLE DBプロバイダーを使用した暗号化DB作成の実装例:
HRESULT CreateEncryptedDB() {
HRESULT hResult = S_OK;
IDBDataSourceAdmin* pDBAdmin = nullptr;
IUnknown* pSession = nullptr;
// OLE DBプロバイダーのインスタンス化
hResult = CoCreateInstance(CLSID_SQLSERVERCE_2_0, 0, CLSCTX_INPROC_SERVER,
IID_IDBDataSourceAdmin, (void**)&pDBAdmin);
if(FAILED(hResult)) return hResult;
// プロパティ設定
DBPROPSET initProps[2] = {0};
DBPROP dbNameProp = {0};
DBPROP securityProps[2] = {0};
// データベース名プロパティ
dbNameProp.dwPropertyID = DBPROP_INIT_DATASOURCE;
dbNameProp.dwOptions = DBPROPOPTIONS_REQUIRED;
dbNameProp.vValue.vt = VT_BSTR;
dbNameProp.vValue.bstrVal = SysAllocString(L"SampleDB.sdf");
// 暗号化プロパティ
securityProps[0].dwPropertyID = DBPROP_SSCE_ENCRYPTDATABASE;
securityProps[0].vValue.vt = VT_BOOL;
securityProps[0].vValue.boolVal = VARIANT_TRUE;
// パスワードプロパティ
securityProps[1].dwPropertyID = DBPROP_SSCE_DBPASSWORD;
securityProps[1].vValue.vt = VT_BSTR;
securityProps[1].vValue.bstrVal = SysAllocString(L"SecurePassword123");
// プロパティセット構成
initProps[0].guidPropertySet = DBPROPSET_DBINIT;
initProps[0].rgProperties = &dbNameProp;
initProps[0].cProperties = 1;
initProps[1].guidPropertySet = DBPROPSET_SSCE_DBINIT;
initProps[1].rgProperties = securityProps;
initProps[1].cProperties = 2;
// データベース作成
hResult = pDBAdmin->CreateDataSource(2, initProps, nullptr,
IID_IUnknown, &pSession);
// リソース解放
SysFreeString(dbNameProp.vValue.bstrVal);
SysFreeString(securityProps[1].vValue.bstrVal);
if(pDBAdmin) pDBAdmin->Release();
return hResult;
}
重要注意事項
- SQL CE 2.0は単一接続のみサポート(操作前必ず既存接続をクローズ)
- テーブル存在確認クエリ:
SELECT table_name FROM INFORMATION_SCHEMA.TABLES - ストアドプロシージャ/トリガー非対応(直接SQL実装必須)
- 日時データ変換例:
DateTime.Parse(xmlNode.InnerXml).ToString("G") - 制限事項:
DISTINCT代わりにGROUP BY使用、TOP句非対応