OLE DBによるSQL Server mdfファイルのオープン

[戻る]
あき 2010/06/07(月) 12:37:04
SQLサーバーのmdfファイル(とその他のファイル)をリムーバブルメディアによって受
け渡しをするという運用で、そのデータベースを参照/更新するようなアプリケーショ
ンを作成しようとしています。

OLE DBのIDBInitializeを使ってそのファイルに接続しようとしているのですがうまくい
きません。
以下テスト用に書いたものの抜粋ですが、IDBInitialize::Initialize()にて、E_FAILED
が返ってきてしまいます。


ちなみに、D:\\Sample\\test.mdfをSQL Server Management Studi Expressで開くことは
できます。
この際、このファイルをデータベースにアタッチしたのですが、このアタッチというの
が良く分かっておりません。
そもそも直接ファイルを開くことはできないのでしょうか。

だとすると、リムーバブルメディアでデータベースを受け渡しするのはあまりお奨めで
きない用途ということになるのでしょうか。




CComPtr<IDBInitialize>    pDBInitialize;
hResult = pDBInitialize.CoCreateInstance(CLSID_SQLNCLI10, NULL, 
CLSCTX_INPROC_SERVER);

DBPROP    dbProp[2];
::VariantInit(&dbProp[0].vValue);
::VariantInit(&dbProp[1].vValue);

dbProp[0].dwPropertyID    = DBPROP_INIT_DATASOURCE;
dbProp[0].vValue.vt    = VT_BSTR;
dbProp[0].vValue.bstrVal    = ::SysAllocString(L"D:\\Sample\\test.mdf");
dbProp[0].dwOptions    = DBPROPOPTIONS_REQUIRED;
dbProp[0].colid        = DB_NULLID;

dbProp[1].dwPropertyID    = DBPROP_AUTH_INTEGRATED;
dbProp[1].vValue.vt    = VT_BSTR;
dbProp[1].vValue.bstrVal    = ::SysAllocString(L"SSPI");
dbProp[1].dwOptions    = DBPROPOPTIONS_REQUIRED;
dbProp[1].colid        = DB_NULLID;

DBPROPSET    dbPropSet[1];
dbPropSet[0].guidPropertySet    = DBPROPSET_DBINIT;
dbPropSet[0].cProperties        = 2;
dbPropSet[0].rgProperties        = dbProp;
    
CComPtr<IDBProperties>    pDBProperties;
hResult = pDBInitialize.QueryInterface(&pDBProperties);

hResult = pDBProperties->SetProperties(1, dbPropSet);

hResult = pDBInitialize->Initialize();  ←しばらくして(タイムアウト?)にて
E_FAILが返る。
hResult = pDBInitialize->Uninitialize();

subaru 2010/06/08(火) 10:34:22
通常SQL Server上のデータベースを他の環境に移すには、
現在のデータベースをデタッチしてから、移行先のSQL Serverでアタッチします。

ユーザーインスタンスの機能を利用することでアプリケーション実行中に
自動的にアタッチするようにもできますが、この機能は将来的に削除されるようです。
http://msdn.microsoft.com/ja-jp/library/ms143684.aspx

こちらも参考になるかな。
http://social.msdn.microsoft.com/Forums/ja-JP/csharpexpressja/thread/90cf2fd9-ae22-4107-8b21-bcf4ab1a6734

あき 2010/06/08(火) 12:54:45
subaru様

返信ありがとうございます。
大変参考になりました。が、まだできずにおります。

とりあえず、データベースのアタッチが必要だということは理解できました。
そこで、アタッチをSQLCMDによってコマンドラインから行い、その上でアタッチされた
データベースに接続することはできました。

つまり、アタッチは手作業で

sqlcmd -S .\SQLEXPRESS -Q "sp_attach_db test 'D:\Test\Test.mdf',
'D:\Test\Test.ldf';"

とし、その上でC++のプログラムの方ではIDBInitialize::Initialize()でS_OKが返ってき
ます。(このときのプロパティとしてはDataSourceとして.\SQLEXPRESS、Catalogとして
testをセットしています。)
この後の実際のクエリー等についてはまだ試していません。

その前に、上記コマンドラインで行っているアタッチ部分をC++(OLE DB)で行いたいので
すがなかなかうまくいかずに難儀しております。

ユーザーインスタンスと言うのは一時的なデータベースインスタンスのことを指している
ということでしょうかね。
今後使わない方がいいようですのでこれは使わないようにします。ユーザーインスタンス
に対して、通常の(恒久的な)アタッチは可能だと思っており、その方法で何とかできな
いか試行錯誤しております。

もう少し頑張ってみます。頂いたリンクから IDataInitializeとかを使うのかな、と推測
してみたりしています。

ありがとうございました。

古いスレッドには追加発言できません。