C++ 如何使用Qt中的数据库驱动程序检查文件是否被占用

C++ 如何使用Qt中的数据库驱动程序检查文件是否被占用,c++,qt,sqlite,C++,Qt,Sqlite,假设我想在Qt中打开到SQLite3数据库的连接。它将连接到现有数据库dbName QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); 现在我需要设置db.setDatabaseName(dbName),其中dbName通过QFileDialog接收 但是,只要dbName是有效的文件名,那么db.open()总是true。是否仍要检查文件dbName是否为SQLite3数据库,而不是任何其他类型的数据库?我现在可以做的是执行查询并检

假设我想在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;
  }
}
db.setDatabaseName(dbName);
if(db.open()){
qsqlqueryqr(db);
如果(!qr.exec(“.database;”)){
qDebug()Qt始终使用该标志,因此不存在或空文件被视为有效(对于新的空数据库)

如果您不想更改Qt或编写自己的数据库驱动程序,唯一的替代方法是手动检查文件中的有效文件。

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


如果您不想更改Qt或编写自己的数据库驱动程序,唯一的替代方法是手动检查文件中是否存在有效的

事实上,有两个问题:

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

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

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


如果您事先对数据库模式一无所知,可以尝试读取其中一个“PRAGMA”值:

我必须面对同样的问题

事实上,有两个问题:

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

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

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


如果您事先对数据库模式一无所知,可以尝试阅读其中一个“PRAGMA”值:

您的应用程序的用途是什么?它应该能够打开任何SQLite数据库,还是您只想访问自己的应用程序的文件?它应该能够打开任何SQLite数据库,读取数据,用户可以修改和保存您的应用程序的用途是什么?它应该能够打开任何SQLite数据吗或者你只是想访问你自己的应用程序的文件?它应该能够打开任何SQLite数据库,读取数据,用户可以修改和保存