sqlite WPF,发送消息框以通知用户数据库已锁定

w46czmvw  于 2023-03-03  发布在  SQLite
关注(0)|答案(1)|浏览(125)

我用C# .Net WPF创建了一个应用程序。这个应用程序使用了一个sqlite数据库,但是这个数据库与其他程序共享。
所以很少有我的应用程序和其他应用程序同时运行,更少有他们试图同时写入DB。。而且所有应用程序都在这一点上崩溃了。。
所以,我想打补丁让我的应用程序等待数据库不再被锁定,然后再对它做一些事情。我一直在考虑做一个肮脏的try/catch循环,尝试很多次,但在我看来,这是一个太肮脏的方式(和资源的浪费)
另一个程序在使用数据库时有一个可视化的指示器,所以我认为解决方案可以包括用户操作。当数据库被锁定时,一个MessageBox打开,通知用户等待,直到其他程序完成后,再单击“确定并继续”。
这是一种不用try/catch就可以测试数据库是否被锁定的方法吗?

zbsbpyhn

zbsbpyhn1#

在注解之后,我尝试了一个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# - How to detect if SQLite DB is locked?

相关问题