假设我想在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;
}
}
但如果文件为空,则无法正常工作。
答案 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