SQL Server Compact Edition開発環境の構築と暗号化データベース作成

環境構築手順と問題解決

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の提案内容(DBINITCONSTANTSINITGUIDの定義)は重複定義エラーを引き起こすため不要

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句非対応

タグ: SQL-Server-CE EVC4 ole-db Database-Encryption COM

8月16日 00:53 投稿