如何判断sqlite数据库文件是否有效

时间:2010-10-08 07:34:45

标签: database file sqlite detection

在下面的代码中,pathToNonDatabase是简单文本文件的路径,而不是真正的sqlite数据库。我希望sqlite3_open能够检测到这一点,但它没有(db不是NULL,而resultSQLITE_OK)。那么,如何检测文件不是有效的sqlite数据库?

sqlite3 *db = NULL;
int result = sqlite3_open(pathToNonDatabase, &db);

if((NULL==db) || (result!=SQLITE_OK)) { 
   // invalid database
}

3 个答案:

答案 0 :(得分:14)

sqlite懒洋洋地打开数据库。打开后立即做一些事情,要求它成为一个数据库。

最好的可能是pragma schema_version;

  • 如果尚未创建数据库,则会报告0(例如,空文件)。在这种情况下,使用(并运行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可以做到。