关于QT使用QSqlDatabase的警告信息的解决方法.

  如下:

QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all

queries will cease to work.

QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.

第一种是:

数据直接被加载到内存中了,当你定义的类被删除时,你应该在main.cpp文件中加载数据库而不是类中。

第二种是(在网上找的,情况因人而异当时我的是出现上面这种错误)

把一切外围的对象都排除了:仅建立一个连接,打开它,然后关闭连接,调用removeDatabase()。居然还有警告!问题已经锁定在我关闭连接的语句上:

QSqlDatabase::removeDatabase(QSqlDatabase::database().connectionName());

默认连接的名字也是默认的,需要通过connectionName()函数获得。这样写貌似没什么问题,后来调试发现,QSqlDatabase::database()静态函数实际上使默认连接的引用计数+1。上述句子相当于:

QSqlDatabase db = QSqlDatabase::database();//获得实例。
QString name = db.connectionName();//获得默认连接名。
QSqlDatabase::removeDatabase(name);//删除默认连接。

这样,问题就清晰了,db获得了一个引用,此时引用计数为2。在调用removeDatabase()时,db对象并没有被删除,默认连接的引用计数仍为2,于是报告警告信息。

我们只需将其改为:

    QString name;
    {
        name = QSqlDatabase::database().connectionName();
    }//超出作用域,隐含对象QSqlDatabase::database()被删除。
    QSqlDatabase::removeDatabase(name);

问题就解决了!

如果直接打默认连接名的话,代码就简单多了,不过名字不太好打(再说了,万一Qt把默认连接名改了呢!):

QSqlDatabase::removeDatabase("qt_sql_default_connection");//不推荐。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的可视化人员管理系统的代码示例: mainwindow.h 文件代码: ```cpp #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QtSql/QSqlDatabase> #include <QtSql/QSqlQuery> #include <QtSql/QSqlTableModel> #include <QtSql/QSqlRecord> QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void on_addButton_clicked(); void on_deleteButton_clicked(); void on_modifyButton_clicked(); void on_searchButton_clicked(); void on_refreshButton_clicked(); private: Ui::MainWindow *ui; QSqlDatabase db; QSqlTableModel *model; }; #endif // MAINWINDOW_H ``` mainwindow.cpp 文件代码: ```cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include <QMessageBox> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); // 连接数据库 db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("person.db"); if(!db.open()) { QMessageBox::critical(this, "错误", "无法连接数据库"); return; } // 初始化表格模型 model = new QSqlTableModel(this, db); model->setTable("person"); model->setEditStrategy(QSqlTableModel::OnManualSubmit); model->select(); // 设置表格视图 ui->tableView->setModel(model); ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection); ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows); ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers); ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); ui->tableView->verticalHeader()->hide(); ui->tableView->show(); } MainWindow::~MainWindow() { delete model; delete ui; } // 添加记录 void MainWindow::on_addButton_clicked() { QSqlRecord record = model->record(); int row = model->rowCount(); model->insertRecord(row, record); ui->tableView->selectRow(row); } // 删除记录 void MainWindow::on_deleteButton_clicked() { int row = ui->tableView->currentIndex().row(); if(row < 0) { QMessageBox::warning(this, "警告", "请选择要删除的记录"); return; } model->removeRow(row); } // 修改记录 void MainWindow::on_modifyButton_clicked() { int row = ui->tableView->currentIndex().row(); if(row < 0) { QMessageBox::warning(this, "警告", "请选择要修改的记录"); return; } model->submitAll(); } // 查询记录 void MainWindow::on_searchButton_clicked() { QString name = ui->nameEdit->text(); model->setFilter(QString("name = '%1'").arg(name)); model->select(); } // 刷新表格 void MainWindow::on_refreshButton_clicked() { model->setTable("person"); model->select(); model->submitAll(); } ``` 这段代码实现了对数据库中 person 表格的增删改查功能,并使用Qt提供的Sql模块来连接数据库。在mainwindow.cpp文件中,我们定义了五个槽函数分别对应添加、删除、修改、查询和刷新操作,这些操作会通过Qt提供的QSqlTableModel类来实现。同时,我们在mainwindow.h文件中声明了QSqlDatabase、QSqlQuery和QSqlTableModel类的头文件。 需要注意的是,这段代码中使用的数据库是SQLite,需要安装SQLite数据库驱动。你可以通过Qt Creator自带的Qt Maintenance Tool来安装驱动。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值