SQLite数据库目前正在使用?

时间:2013-02-21 08:52:46

标签: c# database sqlite

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

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

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

我很抱歉英语不好

2 个答案:

答案 0 :(得分:2)

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

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

如果你必须使用SQLite,那么你应该设置一种机制,在写入时捕获Access Denied Exception并自动检索,直到可配置的超时到期。

SQLite documentation

中所述
  

当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 MultiThreading Reference

答案 1 :(得分:0)

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

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

不可能同时使用Sqlite db文件。