DOBON.NET DOBON.NETプログラミング掲示板過去ログ

【C#】ADOX_MDBコネクションのクローズ、ldbファイルの削除

環境/言語:[C# VisualStudio2008 NET Framework3.5]
分類:[その他]

2011/08/02(Tue) 18:33:22 編集(投稿者)

いつもお世話になっております。

OS、DB:WindowsXp、Access2000

ADOXを使用して、MDBファイルを作成しているのですが、最適化をCompactDatabaseメソッドにて実行したところ、以下のようにエラーが出力されます。

「このデータベースは、マシン 'マシン名' のユーザー 'Admin' が排他的に開いています。データベースが使用可能になった時点で、再度実行してください。」

mdbConnection.Close();と、使用しているコネクションをクローズし、ldbファイルの削除を行っているのですが、この方法ではコネクションが生きているのでしょうか?
また、Console.WriteLine(mdbConnection.State)とロジックに埋込み、コネクションのステータスを確認するとクローズになっております。

認識が違いましたら、アドバイスを頂けないでしょうか。
どうぞ、宜しくお願い致します。
■No28834に返信(talmanさんの記事)

> ldbファイルの削除を行っているのですが、

ldbファイルはプログラムから削除しているのでしょうか?
mdbが正常に閉じたならば、このファイルは自動的に削除されるはずですが?
■No28842に返信(norimakiさんの記事)
> ■No28834に返信(talmanさんの記事)
>
>>ldbファイルの削除を行っているのですが、
>
> ldbファイルはプログラムから削除しているのでしょうか?
> mdbが正常に閉じたならば、このファイルは自動的に削除されるはずですが?

norimakiさん、ご回答ありがとうございます。
MDBファイルの作成→最適化→処理終了の流れなので、
最適化前にプログラムからldbをクローズしております。
排他処理を解除(ldbファイルのクローズ)を行う為には、
Close()メソッドを使用する認識で宜しいでしょうか?

どうぞ、宜しくお願い致します。
■No28847に返信(talmanさんの記事)
認識は同じかもしれませんが、ADODB.Connection.Close()メソッドを呼ぶと
ldbファイルは削除されるはずです。

CompactDatabaseメソッドはADODBにありませんので最適化にはDAOを使用していますか。
こんな感じでできるのではないかと思いますが何か他に処理をしていますか。

static void Main(string[] args)
{
    var srcName = @"C:\Users\a\Documents\src.mdb";
    var dstName = @"C:\Users\a\Documents\dst.mdb";
    var connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\a\Documents\src.mdb";
    var catalog = new ADOX.Catalog();
    var connection = catalog.Create(connectionString) as ADODB.Connection;
    connection.Close();
    var engine = new DAO.DBEngine();
    engine.CompactDatabase(srcName, dstName, null, null, null);
}
■No28852に返信(もりおさんの記事)
> ■No28847に返信(talmanさんの記事)
> 認識は同じかもしれませんが、ADODB.Connection.Close()メソッドを呼ぶと
> ldbファイルは削除されるはずです。
>
> CompactDatabaseメソッドはADODBにありませんので最適化にはDAOを使用していますか。
> こんな感じでできるのではないかと思いますが何か他に処理をしていますか。
>
> static void Main(string[] args)
> {
> var srcName = @"C:\Users\a\Documents\src.mdb";
> var dstName = @"C:\Users\a\Documents\dst.mdb";
> var connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\a\Documents\src.mdb";
> var catalog = new ADOX.Catalog();
> var connection = catalog.Create(connectionString) as ADODB.Connection;
> connection.Close();
> var engine = new DAO.DBEngine();
> engine.CompactDatabase(srcName, dstName, null, null, null);
> }

もりおさん。
ご回答、ありがとう御座います。

MDBファイルの作成、最適化以外に、作成テーブルへの登録を、
一つのソースで行っております。
どうやら、カタログの参照が残っていたようです。
以下のようにして、参照カウントをゼロにしたら、ldbファイルが削除され、
排他エラーは起こらなくなりました。(参考サイト様のソースを丸写しです。。。)

public void FinalReleaseComObject(Object obj)
{
while (Marshal.ReleaseComObject(obj) > 0) ;
}

皆様、お忙しいところ、アドバイスをありがとう御座いました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板