2

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

我原以为我的程序可以尝试写入 SQLite DB,如果其他人在 DB 中写入,我会收到警告“拒绝访问”。

但是我怎么能在 C# 中实现它呢?

我很抱歉英语不好

4

2 回答 2

2

您需要一个不同的数据库: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 多线程参考

于 2013-02-21T08:54:14.387 回答
0

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

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

底线,Sqlite db 文件的并发使用是不可能的。

于 2013-02-21T09:00:58.907 回答