我在C#.Net WPF中创建了一个应用程序。此应用程序使用sqlite数据库,但此数据库与其他程序共享。
我的应用程序和其他应用程序很少同时运行,他们也很少尝试同时在数据库中写入。。此时所有应用程序都崩溃了。。。
所以,我想修补我的应用程序,等待数据库不再被锁定,然后再使用它。我一直在考虑通过多次尝试来创建一个肮脏的try/catch循环,但在我看来,这是一种过于肮脏的方式(浪费资源(
另一个程序在使用数据库时有一个视觉指示器,所以我认为解决方案可能涉及用户操作。当数据库被锁定时,会打开一个MessageBox,通知用户等待其他程序完成后再单击"确定"并继续。
这是一种测试数据库是否被锁定而不进行try/catch的方法吗?
根据注释,我尝试了一个try/catch方法。我仍然不相信这是最干净的方法,因为我不喜欢正在等待异常。在我看来,预期的例外不可能是例外。
也许有人会想出一个不使用这种花招的解决方案,但我还没有找到比这更符合我期望的解决方案。
感谢您的评论。
using SQLite;
public bool IsDatabaseLocked(string dbPath)
{
bool locked = true;
using (SQLiteConnection connection = new SQLiteConnection(dbPath))
{
try
{
connection.Execute("BEGIN EXCLUSIVE");
connection.Execute("COMMIT");
locked = false;
}
catch (SQLiteException)
{
// database is locked error
}
}
return locked;
}
public void WaitForDbToBeUnlocked(string dbPath)
{
int i = 0;
while (IsDatabaseLocked(dbPath))
{
i++;
if (i > 10)
{
MessageBox.Show("Please release manually Database or wait");
i = 0;
}
}
}
我的回答受到以下问题的启发:C#-如何检测SQLite数据库是否被锁定?