【问题标题】:WPF, Send Messagebox to inform user that DataBase is lockedWPF,发送消息框以通知用户数据库已锁定
【发布时间】:2021-09-19 00:05:53
【问题描述】:

我在 C# .Net WPF 中创建了一个应用程序。此应用使用 sqlite 数据库,但此数据库与其他程序共享。

很少有我的应用程序和其他应用程序同时运行,而且他们尝试同时在数据库中写入的情况更少。而且此时所有应用程序都崩溃了...

所以,我想修补我的应用程序以等待数据库不再被锁定,然后再对其进行操作。 我一直在考虑通过多次尝试来制作一个肮脏的 try/catch 循环,但在我看来这是一种太肮脏的方式(并且浪费资源)

另一个程序在使用 db 时有一个视觉指示器,所以我认为解决方案可能涉及用户操作。当数据库被锁定时,会打开一个 MessageBox 通知用户等待其他程序完成后再单击确定并继续。

是不是不用try/catch就可以测试数据库是否被锁定?

【问题讨论】:

  • 我认为“唠叨”用户不需要做任何事情,只需按下按钮重试。我宁愿选择具有最大 reties 的“脏”try/catch 循环。
  • 是的,我没说清楚:用户可以关闭其他主要是故障的程序,它会进行数据库验证,因此它们可以快速或长时间取决于情况;如果稍后重新启动验证,则没有任何区别。
  • 我不知道。你只需要尝试看看会发生什么。但是,如果您正确地与数据库交互,那么等待时间应该不会很长,因此简单的重试模式应该可以有效地向用户隐藏问题。如果由于某种原因确实需要很长时间,请退出并提供消息。
  • 感谢您的观点;但我仍然坚持认为我无法访问使用 db 的错误程序。而且他的使用时间非常混乱。是的,另一种方法是在我使用数据库之前强制杀死我的这个应用程序。然而,我们仍然处于肮脏的道路上。我的观点是,try/catch 方法不是一个好习惯,我试图避免它,在这种特殊情况下,用户操作似乎更可取,但我不知道在没有 try/catch 的情况下测试是否锁定的方法.
  • 尝试打开文件流并捕获任何IOException 是解决您问题的完美解决方案。处理预期的异常不是“资源浪费”。

标签: c# wpf sqlite


【解决方案1】:

在 cmets 之后,我尝试了一种 try/catch 方法。我仍然不相信这是最干净的方法,因为我不喜欢等待异常的想法。在我看来,预期的异常不能是异常。

也许有人会想出一个不使用这种诡计的解决方案,但我还没有找到更符合我期望的解决方案。

感谢您的 cmets。

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?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-02
    • 2023-03-13
    相关资源
    最近更新 更多