我正在编写一个访问数据库的 C# 程序,但网络中的其他人也访问数据库。它是一个 SQLite 数据库。现在我想问一下,如果有人在里面写,是否可以检查 SQLite 数据库?
我原以为我的程序可以尝试写入 SQLite DB,如果其他人在 DB 中写入,我会收到警告“拒绝访问”。
但是我怎么能在 C# 中实现它呢?
我很抱歉英语不好
您需要一个不同的数据库:SQLite 无法处理并发写入连接。只有并发读取。
SQLite 作为本地/客户端存储的嵌入式数据库是一个不错的选择,但如果您需要来自不同线程/pc 的连接,则需要与Sql Server Express不同的解决方案。
如果您必须使用 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 db 文件的并发使用是不可能的。