我正在编写一个访问数据库的C#程序,但网络中的其他人也访问数据库。它是一个SQLite数据库。现在我想问一下,如果有人在其中写入,是否可以检查SQLite数据库?
我原本以为我的程序可能会写入SQLite DB,如果其他人在DB中写入,我会收到警告“拒绝访问”。
但我怎么能在C#中实现呢?
我很抱歉英语不好
答案 0 :(得分:2)
您需要一个不同的数据库:SQLite无法处理并发写入连接。只有并发读取。
SQLite是用于本地/客户端存储的嵌入式数据库的不错选择,但如果您需要来自不同线程/ pc的连接,则需要使用与Sql Server Express不同的解决方案。
如果你必须使用SQLite,那么你应该设置一种机制,在写入时捕获Access Denied Exception并自动检索,直到可配置的超时到期。
中所述当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;
答案 1 :(得分:0)
SQLite是基于文件的,因此它不支持多个连接。
你可以做的是尝试获取文件的锁定,如果失败,你知道其他人正在使用它,然后你可以向用户显示一条消息,或者可以实现一个暂停几个的重试机制秒,再试一次等。
不可能同时使用Sqlite db文件。