Qt/C++ 加载数据库出现qt_sql_default_connection提醒

本文解决了 Qt 中使用 QSqlDatabase 进行数据库操作时遇到的警告问题,包括连接仍在使用和重复连接名称的情况,并提供了具体的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



该警告可能会存在隐式内存泄漏,是由于多次addDatabase调用出现,解决办法如下


警告:

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.


解决方法:

QSqlDatabase datebase;      
if(QSqlDatabase::contains("qt_sql_default_connection"))
             datebase = QSqlDatabase::database("qt_sql_default_connection");
           else
             datebase = QSqlDatabase::addDatabase("QSQLITE");


  powered by: 小乌龟在大乌龟背上

```c++ #include "sqoperator.h" // 引入 SqOperator 类的头文件 SqOperator::SqOperator(QWidget *parent) : QWidget(parent) // SqOperator 类的构造函数 { if (QSqlDatabase::contains("qt_sql_default_connection")) { // 判断是否已存在默认连接 database = QSqlDatabase::database("qt_sql_default_connection"); // 如果存在,则复用该连接 } else { // 如果不存在默认连接 // 建立和SQlite数据库的连接 database = QSqlDatabase::addDatabase("QSQLITE"); // 添加一个新的数据库连接 // 设置数据库文件的名字 database.setDatabaseName("chatapp.db"); } } // 打开数据库 bool SqOperator::openDb() { if (!database.open()) { // 如果打开数据库失败 qDebug() << "Error: Failed to connect database." << database.lastError(); // 输出错误信息 return false; // 返回失败 } else { // 如果打开数据库成功 qDebug() <<"open database success"; // 输出成功信息 } return true; // 返回成功 } // 创建数据表 void SqOperator::createTable() { // 用于执行sql语句的对象 QSqlQuery sqlQuery; // 构建创建数据库sql语句字符串 QString createSql = QString("CREATE TABLE if not exists idinfo(usrname TEXT PRIMARY KEY ,usrpass TEXT NOT NULL)"); sqlQuery.prepare(createSql); // 准备执行sql语句 // 执行sql语句 if(!sqlQuery.exec()) { qDebug() << "Error: Fail to create table. " << sqlQuery.lastError(); // 输出错误信息 } else { qDebug() << "Table created!"; // 输出成功信息 } } // 判断数据库中某个数据表是否存在 bool SqOperator::isTableExist(QString& tableName) { QSqlDatabase database = QSqlDatabase::database(); // 获取当前默认连接的数据库 if(database.tables().contains(tableName)) { // 判断表名是否存在 return true; // 如果存在,返回 true } return false; // 如果不存在,返回 false } ``` SqOperator 类的作用是对 SQLite 数据库进行操作。其中,构造函数用于建立数据库连接,openDb() 用于打开数据库,createTable() 用于创建数据表,isTableExist() 用于判断数据库中是否存在某个数据表。 具体作用和用法如下: - 构造函数 SqOperator(QWidget *parent):构造函数用于建立数据库连接。如果默认连接已存在,则复用该连接;否则添加一个新的 SQLite 数据库连接,并设置数据库文件名为 "chatapp.db"。 - bool openDb():打开数据库。如果打开失败,输出错误信息并返回 false;否则输出成功信息并返回 true。 - void createTable():创建数据表。首先构建创建数据表的 SQL 语句字符串,然后通过 QSqlQuery 对象执行该 SQL 语句。如果执行失败,输出错误信息;否则输出成功信息。 - bool isTableExist(QString& tableName):判断数据库中是否存在某个数据表。首先获取当前默认连接的数据库,然后通过 QSqlDatabase 的 tables() 方法获取所有数据表的表名,最后判断表名是否包含在其中。如果存在,返回 true;否则返回 false。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值