【发布时间】:2018-12-12 04:10:30
【问题描述】:
我正在尝试使用 Dapper 和 SQLite 跟踪 C# 项目中的数据库损坏错误。所以我正在寻找一种方法来检查代码中的数据库完整性。我发现多个地方说我可以为此发送命令“PRAGMA integrity_check”,但是 Dapper Execute 函数只返回一个表示受影响的行数的 int,这在这里没有任何意义(而且似乎只是返回 0 )。
有没有办法进行这种完整性检查或类似的事情?
【问题讨论】:
我正在尝试使用 Dapper 和 SQLite 跟踪 C# 项目中的数据库损坏错误。所以我正在寻找一种方法来检查代码中的数据库完整性。我发现多个地方说我可以为此发送命令“PRAGMA integrity_check”,但是 Dapper Execute 函数只返回一个表示受影响的行数的 int,这在这里没有任何意义(而且似乎只是返回 0 )。
有没有办法进行这种完整性检查或类似的事情?
【问题讨论】:
我不熟悉 Dapper,但如果您使用 SQLite 3.16.0 或更高版本,我认为您至少有 1 个选项。也许2。 从 3.16.0 版本开始,SQLite 有了一个新的实验功能,称为PRAGMA functions。
这实质上意味着现在您可以使用无副作用的内置PRAGMAs 作为表格。
例如,除了旧语法:
PRAGMA integrity_check;
现在您还可以像这样检查数据库完整性:
SELECT integrity_check FROM pragma_integrity_check();
或者:
SELECT * FROM pragma_integrity_check();
因此,如果您可以通过 Dapper 在任意表上运行任意 SELECTs,并访问它们的结果,那么就是这样。
但是,如果您不能,并且您获得的唯一信息实际上只是受影响的行数,那么仍然有解决方案。您可以构造一个查询,如果 integrity_check 为“ok”则删除 1 行,如果不是,则删除 0 行:
DROP TABLE IF EXISTS Dummy;
CREATE TABLE Dummy as SELECT 'ok' as Value;
DELETE FROM Dummy WHERE Value = (SELECT * FROM pragma_integrity_check());
这在 SQLite 版本 3.25.3 上适用于我,但正如我所说,它只是一个实验性功能,仍会发生变化,版本之间的确切语法可能会或可能不会不同。
【讨论】: