我有一个小问题,我正在努力解决。我正在使用SQLite数据库,并且我第一次启动应用程序时自动创建了我的数据库Schedule.db(如果.db尚未存在)。
在button_click上我想删除它,这样当我再次启动我的应用程序时,我可以创建一个新的。
问题是,每次我尝试删除它时都会收到错误:
“附加信息:进程无法访问文件'/filePath.../Scheduler.db',因为它正由另一个进程使用。”
我知道我无法删除它,因为我的应用程序已经在使用它但是我的当前问题是否有任何解决方案?
string databasePath = AppDomain.CurrentDomain.BaseDirectory + "Scheduler.db";
if (MessageBox.Show("Do you want to delete database: [Scheduler.db]?", "Question", MessageBoxButton.YesNo, MessageBoxImage.Warning, MessageBoxResult.Yes) == MessageBoxResult.Yes)
{
if (File.Exists(databasePath))
{
SQLiteConnection connectionSqlLIte = new SQLiteConnection(@"Data Source=Scheduler.db;Version=3;");
connectionSqlLIte. Close();
File.Delete(databasePath);
MessageBox.Show("Database deleted: [Scheduler] ");
Application.Current.Shutdown();
}
else
{
MessageBox.Show("There is no database: [Scheduler]!");
}
}
我在这里飞得有点失明,没有您的确切代码,但这值得尝试:
...
connectionSqLite.Close();
connectionSqLite.Dispose();
connectionSqLite = null; // Bad coding, see if you can delete this line
...
现在可以自由删除(并重新创建)数据库
你不应该设置connectionSqLite = null
,这是过度的,通常是不必要的,也有点不正确,但无论如何都要尝试。见here
(但是 - 请记住,在Dispose
对象上调用connectionSqLite
之后 - 它基本上是空的(null
)。所以你必须先将它设置为对象的新实例才能再次使用它)
在连接关闭后强制执行垃圾收集,如下所示: -
string databasePath = AppDomain.CurrentDomain.BaseDirectory + "Scheduler.db";
if (MessageBox.Show("Do you want to delete database: [Scheduler.db]?", "Question", MessageBoxButton.YesNo, MessageBoxImage.Warning, MessageBoxResult.Yes) == MessageBoxResult.Yes)
{
if (File.Exists(databasePath))
{
SQLiteConnection connectionSqlLIte = new SQLiteConnection(@"Data Source=Scheduler.db;Version=3;");
connectionSqlLIte. Close();
//Force a garbage collection here
GC.Collect();
GC.WaitForPendingFinalizers();
//Now you should be able to delete the file now
File.Delete(databasePath);
MessageBox.Show("Database deleted: [Scheduler] ");
Application.Current.Shutdown();
}
else
{
MessageBox.Show("There is no database: [Scheduler]!");
}
}