SQLite数据库当前正在使用中

本文关键字:数据库 SQLite | 更新日期: 2023-09-27 18:00:25

我正在编写一个C#程序,该程序访问数据库,但网络中的其他程序也访问该数据库。它是一个SQLite数据库。现在我想问如果有人只是在SQLite数据库中写入,是否可以检查它

我曾认为我的程序可以尝试写入SQLite数据库,如果其他人在数据库中写入,我会收到警告"拒绝访问"。

但是我如何在C#中实现这一点呢?

很抱歉英语不好

SQLite数据库当前正在使用中

您需要一个不同的数据库:SQLite无法处理并发写入连接。仅并发读取。

SQLite作为本地/客户端存储的嵌入式数据库是一个不错的选择,但如果您需要来自不同线程/PC的连接,则需要与Sql Server Express不同的解决方案。

如果必须使用SQLite,那么应该设置一种机制,在写入时捕获拒绝访问异常并自动检索,直到可配置的超时到期。

如SQLite文档中所述

当SQLite试图访问被另一个进程锁定的文件时,默认行为是返回SQLite_BUSY

测试SQLITE_BUSY。以下是一些伪代码来说明解决方案:

while (continueTrying) {
   retval = sqlite_exec(db, sqlQuery, callback, 0, &msg);
switch (retval) {
  case SQLITE_BUSY:
    Log("[%s] SQLITE_BUSY: sleeping fow a while...", threadName);
    sleep a bit... (use something like sleep(), for example)
    break;
  case SQLITE_OK:
    continueTrying = NO; // We're done
    break;
  default:
    Log("[%s] Can't execute '"%s'": %s'n", threadName, sqlQuery, msg);
    continueTrying = NO;
    break;
}
}
return retval;

SQLite多线程参考

SQLite是基于文件的,因此它不支持同时进行多个连接。

你可以做的是尝试获得文件的锁定,如果失败,你知道其他人正在使用它,然后你可以向用户显示一条消息,或者可能实现一个重试机制,暂停几秒钟,然后重试等等。

最重要的是,不可能同时使用Sqlite数据库文件。