锁定SQLite数据库以便从c#中读取

时间:2010-02-18 06:42:00

标签: c# sqlite

我的项目有c ++ dll,其中在Sqllite中使用share deny = none创建数据库。这个dll会将数据插入到Db中,我有一个c#exe,它必须访问db并显示它。显示需要异步完成。因此,在启动与sqlitedb的连接时,我可以锁定表或数据库。如果可能,任何人都可以给我链接或样品如何完成。谢谢提前

1 个答案:

答案 0 :(得分:4)

了解SQLite pragma-s。 http://www.sqlite.org/pragma.html

PRAGMA locking_mode;
PRAGMA locking_mode = NORMAL | EXCLUSIVE

此pragma设置或查询数据库连接锁定模式。锁定模式是NORMAL或EXCLUSIVE。

在NORMAL锁定模式(默认)下,数据库连接在每次读取或写入事务结束时解锁数据库文件。当锁定模式设置为EXCLUSIVE时,数据库连接永远不会释放文件锁。第一次以EXCLUSIVE模式读取数据库时,将获取并保持共享锁。第一次写入数据库时​​,会获得并保持独占锁定。

通过关闭数据库连接,或者通过使用此pragma将锁定模式设置回NORMAL然后访问数据库文件(用于读取或写入),可以释放通过EXCLUSIVE模式的连接获得的数据库锁。简单地将锁定模式设置为NORMAL是不够的 - 直到下次访问数据库文件时才会释放锁。

将锁定模式设置为EXCLUSIVE有两个原因。一种是如果应用程序实际上想要阻止其他进程访问数据库文件。另一种是通过在此模式下启用的优化来保存少量文件系统操作。这在嵌入式环境中可能很重要。

当locking_mode pragma指定特定数据库时,例如:

PRAGMA main.locking_mode = EXCLUSIVE; 然后锁定模式仅适用于指定的数据库。如果没有数据库名称限定符在“locking_mode”关键字之前,则锁定模式将应用于所有数据库,包括由后续ATTACH命令添加的任何新数据库。

“temp”数据库​​(存储TEMP表和索引)和内存数据库始终使用独占锁定模式。无法更改临时和内存数据库的锁定模式。默认情况下,所有其他数据库都使用常规锁定模式,并受此编译指示的影响。

PRAGMA同步;
PRAGMA synchronous = 0 |关闭| 1 |正常| 2 | FULL;

查询或更改“同步”标志的设置。第一个(查询)表单将同步设置作为整数返回。当synchronous为FULL(2)时,SQLite数据库引擎将在关键时刻暂停,以确保在继续之前数据实际已写入磁盘表面。这可确保在操作系统崩溃或电源故障时,重新启动后数据库将不会损坏。完全同步非常安全,但速度也慢。当同步为NORMAL(1)时,SQLite数据库引擎仍将在最关键的时刻暂停,但不如FULL模式下。有一个非常小(但非零)的机会,即在错误的时间发生电源故障可能会在NORMAL模式下损坏数据库。但实际上,您更有可能遭受灾难性磁盘故障或其他一些不可恢复的硬件故障。使用同步OFF(0),SQLite一旦将数据传递给操作系统就会继续暂停。如果运行SQLite的应用程序崩溃,则数据将是安全的,但如果操作系统崩溃或计算机在将数据写入磁盘表面之前断电,则数据库可能会损坏。另一方面,同步OFF时,某些操作的速度可提高50倍或更多。

默认设置为synchronous = FULL。