如何在Qt中检查文件是否适合数据库驱动程序

时间:2016-06-22 22:51:43

标签: c++ qt sqlite

假设我想在Qt中打开与SQLite3数据库的连接。它将连接到现有数据库dbName

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");

现在我需要设置db.setDatabaseName(dbName),其中dbName是通过QFileDialog收到的。

但是,只要dbName是有效的文件名,db.open()始终为true。无论如何都要检查文件dbName是否是SQLite3数据库,而不是任何其他类型的数据库?我现在可以做的是执行查询并检查错误,如:

db.setDatabaseName(dbName);
if (db.open()) {
  QSqlQuery qr(db);
  if (!qr.exec(".database;")) {
    qDebug() << qr.lastError().text();
    return false;
  }
}

但如果文件为空,则无法正常工作。

2 个答案:

答案 0 :(得分:1)

Qt始终使用SQLITE_OPEN_CREATE标志,因此不存在或空文件被认为是有效的(对于新的空数据库)。

如果您不想更改Qt或编写自己的数据库驱动程序,唯一的选择是手动检查文件中的有效database header

答案 1 :(得分:1)

我不得不面对同样的问题。

事实上,有两个问题:

1 /正如CL所说,Qt总是使用SQLITE_OPEN_CREATE标志,因此如果您尝试打开指向不存在的文件的数据库,将创建数据库并获得成功。

您可以通过在打开之前检查文件是否存在来解决此问题(请参阅QFile :: Exists静态方法)

2 / SQLite使用“延迟初始化”,因此在您对数据库发出请求之前,该文件并未真正打开。 您可以在数据库打开后立即执行简单请求来解决此问题,并检查结果。

如果您事先对数据库架构一无所知,可以尝试阅读其中一个“PRAGMA”值:http://www.sqlite.org/pragma.html#pragma_table_info