C++ QSqlDatabasePrivate::removeDatabase:connection';myConnectionName';仍在使用中,所有查询将停止工作

C++ QSqlDatabasePrivate::removeDatabase:connection';myConnectionName';仍在使用中,所有查询将停止工作,c++,sql,database,qt,C++,Sql,Database,Qt,我有一个文件夹,其中有许多数据库。有时可能会将数据库删除或添加到文件夹中。 所以我使用QTimer读取所有数据库 这是我的代码: this->timer = new QTimer(this); this->timer->setInterval(15000); connect(this->timer, &QTimer::timeout, this, [=]() { QString path = "C:\\Users\\User\\Desktop\\DAXI

我有一个文件夹,其中有许多数据库。有时可能会将数据库删除或添加到文件夹中。 所以我使用QTimer读取所有数据库

这是我的代码:

this->timer = new QTimer(this);
this->timer->setInterval(15000);
connect(this->timer, &QTimer::timeout, this, [=]() {
    QString path = "C:\\Users\\User\\Desktop\\DAXI SMS SENDER\\SMSSenderAllBASE";
    //QString path = qApp->applicationDirPath() + "\\SMSSenderAllBASE";
    QDir recoredDir(path);
    QStringList allFiles = recoredDir.entryList(QDir::NoDotAndDotDot | QDir::System | QDir::Hidden  | QDir::AllDirs | QDir::Files, QDir::DirsFirst);
    for (int i = 0; i < allFiles.size(); i++) {
        QString fullPath = path + "\\" + allFiles[i];
        QString connectionName = allFiles[i];
        connectionName = connectionName.remove(connectionName.size() - 4, 4);
        QSqlDatabase db = QSqlDatabase::addDatabase("QIBASE", connectionName);
        db.setDatabaseName(fullPath);
        db.setHostName("localhost");
        db.setPort(3050);
        db.setUserName("SYSDBA");
        db.setPassword("masterkey");

        thrdHelperSendSMS *help = new thrdHelperSendSMS(db, this);
        connect(help, &thrdHelperSendSMS::helperFinished, this, [=](QString connectionName){
            QSqlDatabase t_db = QSqlDatabase::database(connectionName);
            t_db.close();
            QSqlDatabase::removeDatabase(connectionName);
            delete help;
        });
        help->run();
    }
});
this->timer->start();
例如:

for (int i = 0; i < allFiles.size(); i++) {
    QString fullPath = path + "\\" + allFiles[i];
    QString connectionName = allFiles[i];
    connectionName = connectionName.remove(connectionName.size() - 4, 4);
    QSqlDatabase db = QSqlDatabase::addDatabase("QIBASE", connectionName);
    db.setDatabaseName(fullPath);
    db.setHostName("localhost");
    db.setPort(3050);
    db.setUserName("SYSDBA");
    db.setPassword("masterkey");

    QSqlDatabase::removeDatabase(connectionName);
}
for(int i=0;i

我也有同样的错误。

您没有正确使用
removeDatabase()。SqlDatabase的对象需要首先超出范围。看

错误使用

QSqlDatabase db = QSqlDatabase::database("sales");
QSqlQuery query("SELECT NAME, DOB FROM EMPLOYEES", db);
QSqlDatabase::removeDatabase("sales"); // will output a warning
{
    QSqlDatabase db = QSqlDatabase::database("sales");
    QSqlQuery query("SELECT NAME, DOB FROM EMPLOYEES", db);
}
// Both "db" and "query" are destroyed because they are out of scope
QSqlDatabase::removeDatabase("sales"); // correct
正确使用

QSqlDatabase db = QSqlDatabase::database("sales");
QSqlQuery query("SELECT NAME, DOB FROM EMPLOYEES", db);
QSqlDatabase::removeDatabase("sales"); // will output a warning
{
    QSqlDatabase db = QSqlDatabase::database("sales");
    QSqlQuery query("SELECT NAME, DOB FROM EMPLOYEES", db);
}
// Both "db" and "query" are destroyed because they are out of scope
QSqlDatabase::removeDatabase("sales"); // correct
在第二个示例中,
db
将超出范围
after}
并且您将不再看到错误消息
QSqlDatabasePrivate::removeDatabase:connection'myConnectionName'仍在使用中,所有查询将停止工作

请仔细阅读文档。数据库的内容是合理的,每一行都需要仔细检查

您还缺少
db.close()
;-在删除数据库之前关闭它是有意义的。

QSqlDatabase db=QSqlDatabase::addDatabase(“qslite”,“conn_name”);
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "conn_name");
db.open();
if (db.open())
    {
        qDebug()<<"DataBase is Open";
    }
    else
    {
        qDebug()<<"DataBase is Not Open";

    }
QSqlQueryModel * model = new QSqlQueryModel();
QSqlQuery query(QSqlDatabase::database("conn_name"));
query.exec("SMTHING")
if (query.exec())
{
   while (query.next())
      {
         ui->QTableView->setModel(model);
         model->setHeaderData(2, Qt::Horizontal, QObject::tr("????"));
      }
}
db.close();
QSqlDatabase::removeDatabase("conn_name");



Here is my code
db.open(); if(db.open()) {
qDebug()@user3606329的答案是正确的,但我添加了这种可能性:

QSqlDatabase db = QSqlDatabase::database("sales");
{
    QSqlQuery query("SELECT NAME, DOB FROM EMPLOYEES", db);
    //use query
}
db = QSqlDatabase();
QSqlDatabase::removeDatabase("sales");

这不是真正的错误。非常感谢,它可以工作:)如果我留下这个错误,会发生什么问题?数据库不会被删除。也就是说,当你再次添加它时,它会抛出一个已经存在的错误。关闭数据库应该够了,但似乎不够。我认为这是一个Qt问题。@Jolly Roger这还不够。我还想知道为什么u评论一篇超过一年的帖子?
db
现在是一个悬空的无效数据库连接,仍然有一个引用
QSqlDatabase db