在下面的代码中,pathToNonDatabase
是简单文本文件的路径,而不是真正的sqlite数据库。我希望sqlite3_open
能够检测到这一点,但它没有(db
不是NULL
,而result
是SQLITE_OK
)。那么,如何检测文件不是有效的sqlite数据库?
sqlite3 *db = NULL;
int result = sqlite3_open(pathToNonDatabase, &db);
if((NULL==db) || (result!=SQLITE_OK)) {
// invalid database
}
答案 0 :(得分:14)
sqlite懒洋洋地打开数据库。打开后立即做一些事情,要求它成为一个数据库。
最好的可能是pragma schema_version;
。
CREATE TABLE
等)如果您需要更彻底的检查,可以使用pragma quick_check;
。这是一个更轻量级的完整性检查,它会跳过检查表的内容是否与索引对齐。它仍然可能很慢。
避免使用integrity_check
。它不仅检查每个页面,而且还根据索引验证表的内容。这对大型数据库来说是冰冷的。
答案 1 :(得分:5)
对于需要在C#中使用System.Data.SQLite执行此操作的任何人,您可以启动一个事务,然后立即将其回滚,如下所示: -
private bool DatabaseIsValid(string filename)
{
using (SQLiteConnection db = new SQLiteConnection(@"Data Source=" + filename + ";FailIfMissing=True;"))
{
try
{
db.Open();
using (var transaction = db.BeginTransaction())
{
transaction.Rollback();
}
}
catch (Exception ex)
{
log.Debug(ex.Message, ex);
return false;
}
}
return true;
}
如果文件不是有效数据库,则抛出以下SQLiteException
- 文件已加密或不是数据库(System.Data.SQLite.SQLiteErrorCode.NotADb
)。如果您没有使用加密数据库,那么此解决方案应该足够了。
(只有版本1.0.81.0的System.Data.SQLite需要' db.Open()'但是当我升级到版本1.0.91.0时,我不得不插入内部使用块来获取它工作)。
答案 2 :(得分:2)
我认为一个pragma integrity_check可以做到。