2012-01-20 17 views
0

私のC++コードは、SqlServerデータベースバックアップファイルを正常に復元し、OLEDB APIを使用して結果データベースから必要な情報を抽出します。ここでC++でOLEDBを使用してMDFデータベースファイルに接続する方法は?

は私のC++コードは、私が復元されたデータベースに対してさまざまなクエリを実行するために使用する準備ができIDBCreateCommandインスタンスを取得し、その最後には、次のとおりです。それは何

DB::DB(LPCWSTR wszDataSource, LPCWSTR wszBackupFilePath, LPCWSTR wszRestoreFolderPath) 
{ 
    fs::path backupFilePath = fs::canonical(wszBackupFilePath).make_preferred(); 
    fs::path restoreFolderPath = fs::canonical(wszRestoreFolderPath).make_preferred(); 
    std::wstring db = backupFilePath.leaf().stem().wstring(); 
    boost::wformat restoreQueryFmt(L"RESTORE DATABASE [%2%] FROM DISK = N'%1%' WITH REPLACE, STATS = 10, MOVE N'%2%' TO N'%3%\\%2%.mdf', MOVE N'%2%_log' TO N'%3%\\%2%.LDF'"); 
    std::wstring query = (restoreQueryFmt % backupFilePath.wstring() % db % restoreFolderPath.wstring()).str(); 

    IDBInitializePtr spDBInitialize; 
    HRESULT hr = spDBInitialize.CreateInstance(CLSID_SQLNCLI10, NULL); 
    if (REGDB_E_CLASSNOTREG == hr) 
    { 
    hr = spDBInitialize.CreateInstance(CLSID_SQLNCLI, NULL); 
    } 
    _HRESULT_CHECK3(spDBInitialize, hr); 

    _variant_t vDataSource(wszDataSource); 
    _variant_t vAuth(L"SSPI"); 

    DBPROP dbprop[2];   // property used in property set to initialize provider 

    dbprop[0].dwPropertyID = DBPROP_INIT_DATASOURCE; 
    dbprop[0].dwOptions = DBPROPOPTIONS_REQUIRED; 
    dbprop[0].vValue = vDataSource; 

    dbprop[1].dwPropertyID = DBPROP_AUTH_INTEGRATED; 
    dbprop[1].dwOptions = DBPROPOPTIONS_REQUIRED; 
    dbprop[1].vValue = vAuth; 

    DBPROPSET dbpropset[1];  // Property Set used to initialize provider 
    dbpropset[0].guidPropertySet = DBPROPSET_DBINIT; 
    dbpropset[0].rgProperties = dbprop; 
    dbpropset[0].cProperties = sizeof(dbprop)/sizeof(dbprop[0]); 

    // Set initialization properties. 
    IDBPropertiesPtr spDBProperties = spDBInitialize; 

    _HRESULT_CHECK(spDBProperties, SetProperties(1, dbpropset)); 
    _HRESULT_CHECK(spDBInitialize, Initialize()); 

    IDBCreateSessionPtr spCreateSession = spDBInitialize; 
    _HRESULT_CHECK(spCreateSession, CreateSession(NULL, IID_IDBCreateCommand, reinterpret_cast<IUnknown **>(&m_spDBCreateCommand))); 

    ICommandTextPtr spCommandText; 
    _HRESULT_CHECK(m_spDBCreateCommand, CreateCommand(NULL, IID_ICommandText, reinterpret_cast<IUnknown **>(&spCommandText))); 

    _HRESULT_CHECK(spCommandText, SetCommandText(DBGUID_SQL, query.c_str())); 
    _HRESULT_CHECK(spCommandText, Execute(NULL, IID_NULL, NULL, NULL, NULL)); 
    _HRESULT_CHECK(spCommandText, SetCommandText(DBGUID_SQL, (boost::wformat(L"USE \"%1%\"") % db).str().c_str())); 
    _HRESULT_CHECK(spCommandText, Execute(NULL, IID_NULL, NULL, NULL, NULL)); 
} 

は次のとおりです。

  1. 指定されたデータソース(「¥SQLEXPRESS」など)とSSPI統合認証スキームを使用して、新しいデータベース接続を初期化します。
  2. このように、RESTORE DATABASE T-SQLステートメントを実行:RESTORE DATABASE [my_db] FROM DISK = N'c:\temp\my_db.ebf' WITH REPLACE, STATS = 10, MOVE 'my_db' TO N'c:\temp\my_db.mdf', MOVE N'my_db_log' TO N'c:\temp\my_db.LDF'
  3. のでUSE "my_db"

を実行して、後続の問合せのための新しいデータベースを使用して、私は何の問題データベースのバックアップファイルを復元してからprocedingを持っていませんそこ。

今、別の問題に直面しています。既存のMDFファイルではなく、バックアップファイルがないとします。OLEDB C++ APIを使用してどのようにファイルに添付すればよいですか?

ありがとうございました。必要に応じて.LDFなど -

EDITは

.mdfファイルのファイルは、データベースエンジンによって必要なすべてのファイルが添付されているものとします。

答えて

1

あなたとMDFファイルがすべてある場合はデータベースを接続できません。なぜなら、それはせいぜいデータベースの半分にすぎないからです。 MD とLDFが必要です。元のデータベースを構成する追加のNDFファイルまたはセカンダリLDFファイル。

は、あなたがしなければならないすべてはこの文を実行され、あなたは%1%および%3%とMDFとLDFがあるとします。

CREATE DATABASE [%2%] 
    ON (FILENAME=N'%1%') 
    , (FILENAME=N'%3') 
    FOR ATTACH; 

How to: Move a Database Using Detach and Attach (Transact-SQL)

に添付するためのオプションを参照してくださいMDFだけが存在します(FOR ATTACH_REBUILD_LOGを使用します)が、それはきれいにシャットダウンされたデータベース(それ以外の場合は破損したデータベースにつながる可能性があります)上で動作するので、多くの警告が付属しています。セカンダリNDFファイルがない場合、データベースをアタッチするオプションはありません。

+0

btw、マネージドC++と[SMO](http://msdn.microsoft.com/en-us/library/ms162169.aspx)を使用したり、SMOを活用して必要なものを公開するマネージドDLL COM経由であなたのアプリに機能を提供しますか? –

+0

私のアプリは、3つのdbエンジンを扱わなければなりません。そのうちの1つは、管理されたラッパーがない、埋め込まれたmysql(libmysqld.dll)サーバーです。そこで私はネイティブのC++にとどまることを決めました。 – mark

関連する問題