c# - 锁定 SQLite 数据库以从 C# 读取

标签 c# sqlite

我的项目有一个 C++ dll,其中一个数据库是在 Sqllite 中创建的,共享拒绝 = 无。这个 dll 会将数据插入 Db,我有一个 C# .exe,它必须访问 db 并显示它。显示需要异步完成。在启动与 sqlitedb 的连接时有什么方法可以锁定表或数据库?如果可能的话,任何人都可以给我链接或关于如何完成的示例吗?提前致谢。

最佳答案

查看 SQLite pragma-s。 http://www.sqlite.org/pragma.html

PRAGMA locking_mode;
PRAGMA 锁定模式 = 正常 |独家

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

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

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

将锁定模式设置为独占有两个原因。一种是应用程序是否真的想阻止其他进程访问数据库文件。另一个是在这种模式下启用的优化可以节省少量文件系统操作。这在嵌入式环境中可能很重要。

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

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

“临时”数据库(其中存储了 TEMP 表和索引)和内存数据库始终使用独占锁定模式。无法更改临时数据库和内存数据库的锁定模式。所有其他数据库默认使用普通锁定模式并受此编译指示影响。

PRAGMA同步;
杂注同步 = 0 |关 | 1 |正常 | 2 |已满;

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

默认设置是 synchronous=FULL。

关于c# - 锁定 SQLite 数据库以从 C# 读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2286772/

相关文章:

SQLite - 字符或字符串的十六进制值

sql - 选择所有至少具有带通​​配符支持功能的列表的行

python - 使用 python 2.7.3 和 pysqlite2 2.6.3 升级 sqlite3 版本

c# - 将列表转换为字符串列表

c# - 使用 DesignMode 属性与 LicenseManager.UsageMode

c# - 将硬编码的 switch 语句转换为动态加载的多键一值查找

iphone - 将日期插入 SQLite

sql - 在多对多表中查询 AND

c# - StreamReader 在同时读取非常大的文件时性能不佳

c# - mscorlib 代表什么?