OLE DBによるSQL Server mdfファイルのオープン – プログラミング – Home

通知
すべてクリア

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


あき
 あき
(@あき)
ゲスト
結合: 24年前
投稿: 47
Topic starter  

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(LD:\\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(LSSPI);
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
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

通常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


返信引用
あき
 あき
(@あき)
ゲスト
結合: 24年前
投稿: 47
Topic starter  

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とかを使うのかな、と推測
してみたりしています。

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました