ACCESSデータベースは使用中にロックファイル(*.ldb)を作成しますが、
データベースを閉じた(つもり)なのにこのロックファイルがなかなか消えません。
C:_Tmp\test.accdb というデータベースを用意し、
ボタンを一つ配置したような簡単な画面を作成してみました。
プロバイダは "Microsoft.Ace.OLEDB.12.0"、
データベース種類は accdb です。
デバッガでコード中(*C)の行にブレークポイントを置きます。
ボタンを押すとデータベースに接続(db.Connect())を実行し、
すぐに切断(db.Disconnect())を実行します。
エクスプローラを開いて C:_Tmp\test.accdb を見つつ動作させてみると、
- コード中の(*A)の行を実行すると test.ldb が作成される。
これは、(*A)にブレークポイントを置いてステップ実行し、
この行が実行された際に test.ldb が作成されたことを予め確認しています。 - ソース中(*C)のブレークポイントで止まる。
しばらくそのまま放置する。 - ブレークポイントで止まったまま約80秒経過したあたりで、
エクスプローラから test.ldb が消える。
つまり、(*B)を実行した後、しばらくして非同期で消えるようなのです。
なぜこんなにも時間がかかるのか、
あるいは、プログラムに誤りなどありましたらお教えください。
ちなみに、以前はこのようなことがなく動いていたように思います。
以前と違う点は、
・Windows7 から 10 に端末を変更した。
・VisualStudio 2017 から 2019 に変更となった。
・Windows7 の端末では Office 2013 が入っていたが、
これには Office365 の 32bit が入っている。
前の Windows7 端末は没収の上初期化されてしまったので、
環境が分からなくなってしまったのですが、
何か必要なものがインストールされていないなどあるでしょうか。
(Accessランタイムなどはこの端末には入れていません。)
どうぞよろしくお願いいたします。
using System; using System.Windows.Forms; using System.Data.OleDb; // OleDbConnection... namespace Test { public partial class Form1 : Form { public class DB { public OleDbConnection ConnectionObj {get; private set;} public DB() { ConnectionObj = null; } public void Connect() { if (ConnectionObj == null) { ConnectionObj = new OleDbConnection(); } string provider = "Microsoft.Ace.OLEDB.12.0"; string source = @"C:\_Tmp\test.accdb"; string connectionString = $"Provider={provider};Data Source={source}"; ConnectionObj.ConnectionString = connectionString; ConnectionObj.Open(); // <-------- (*A)ここでldbが作成される } public void Disconnect() { if (ConnectionObj != null) { ConnectionObj.Close(); // <-------- (*B)ここでldbが破棄されるはず? ConnectionObj.Dispose(); // <-------- (*C)ここでブレークポイント ConnectionObj = null; } } } public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { DB db = new DB(); db.Connect(); db.Disconnect(); db = null; } } }
回答2件
あなたの回答
tips
プレビュー