QT-mysql-初始化-链接-查询给大家一个可用示例,供大家参考,亲测可行。
1.mysql.h
cpp
class mysqldb : public QObject
{
Q_OBJECT
public:
explicit mysqldb(QObject *parent = nullptr);
~mysqldb();
QSqlDatabase m_db;
QSqlQuery m_query;
QString m_dbhost, m_dbport, m_dbname, m_dbuser, m_dbpassword, m_resulttable, m_connname;
QTimer *m_timer;
int m_ncheckcolumnsTime;
void initDB();
void closeDB();
bool connectDB();
void setquery();
bool isConnected() const;// 检查是否已连接
bool executeQuery(const QString& sql);// 执行SQL查询
public:
bool tableExists(const QString &tableName);// 检查表是否存在
bool columnsMatch(const QString &tableName, const QMap<QString,QString> &columns);// 检查列名是否一致
void createTable(const QString &tableName, const QMap<QString,QString> &columns);// 创建表
void updateTable(const QString &tableName, const QMap<QString,QString> &columns);// 更新表结构
void updateTableData(const QString &tableName, const QMap<QString, QString> &datas);
};
2.mysql.cpp
cpp
#include "mysqldb.h"
mysqldb::mysqldb(QObject *parent) : QObject(parent)
{
m_timer = new QTimer(this);
}
mysqldb::~mysqldb()
{
QString strmsg;
try {
// 关闭数据库连接
if (m_db.isOpen())
{
m_db.close();
strmsg = "---~mysqldb()~close DB connection";
LogManager::logCMN(strmsg,LogSeverity::Info);
}
// 从连接池中移除数据库连接
if (m_db.isValid())
{
m_db = QSqlDatabase(); // 释放数据库连接
QSqlDatabase::removeDatabase(m_connname); // 从连接池中移除
strmsg = "---mysqldb()~remove from connect pool";
LogManager::logCMN(strmsg,LogSeverity::Info);
}
}
catch (const std::exception& e) {
qDebug() << "Exception in ~mysqldb: " << e.what();
}
catch (...) {
qDebug() << "Unknown exception in ~mysqldb";
}
}
void mysqldb::initDB()
{
QString strmsg,errMsg;
try {
strmsg= "CSU_fmeteorandpower---mysqldb---initDB--m_connname=";
strmsg+=m_connname;
LogManager::logCMN(strmsg,LogSeverity::Info);
if (QSqlDatabase::contains(m_connname))
{
m_db = QSqlDatabase::database(m_connname);
}
else
{
m_db = QSqlDatabase::addDatabase("QMYSQL", m_connname);
}
m_db.setHostName(m_dbhost);
m_db.setPort(m_dbport.toInt());
m_db.setUserName(m_dbuser);
m_db.setPassword(m_dbpassword);
m_db.setDatabaseName(m_dbname);
m_timer = new QTimer(this);
m_timer->setInterval(10000); // 10秒
}
catch (const std::exception& e) {
QString strmsg = "---mysqldb---initDB--Exception";
strmsg += e.what();
LogManager::logCMN(strmsg,LogSeverity::Info);
}
catch (...) {
QString strmsg = "---Fmysqldb---initDB---Exception";
LogManager::logCMN(strmsg,LogSeverity::Info);
}
}
void mysqldb::setquery()
{
m_query = QSqlQuery(m_db);
}
bool mysqldb::connectDB()
{
QString strmsg,errMsg;
try {
if(!m_db.isOpen())
{
if(m_db.open())
{
// m_timer->stop(); // 连接成功,停止定时器
// emit connectionStatusChanged(true);
strmsg = "CSU_fmeteorandpower---mysqldb::connectDB()---successful";
LogManager::logCMN(strmsg,LogSeverity::Info);
return true;
}
else
{
// emit connectionStatusChanged(false);
strmsg = "CSU_fmeteorandpower---mysqldb::connectDB()---fail";
LogManager::logCMN(strmsg,LogSeverity::Info);
return false;
}
}
}
catch (const std::exception& e)
{
QString strmsg= "CSU_fmeteorandpower---mysqldb::connectDB() Exception:";
strmsg +=e.what();
//qDebug()<<strmsg;
LogManager::logCMN(strmsg,LogSeverity::Error);
}
catch (...) {
QString strmsg = "CSU_fmeteorandpower---mysqldb::connectDB()---Exception";
//qDebug()<<strmsg;
LogManager::logCMN(strmsg,LogSeverity::Error);
}
}
void mysqldb::closeDB()
{
QString strmsg,errMsg;
try {
strmsg = "---mysqldb::closeDB()---";
LogManager::logCMN(strmsg,LogSeverity::Info);
// 关闭数据库连接
if (m_db.isOpen())
{
m_db.close();
strmsg += "---close DB connection";
LogManager::logCMN(strmsg,LogSeverity::Info);
}
// 从连接池中移除数据库连接
if (m_db.isValid())
{
m_db = QSqlDatabase(); // 释放数据库连接
QSqlDatabase::removeDatabase(m_connname); // 从连接池中移除
strmsg = "---closeDB,remove from connect pool";
LogManager::logCMN(strmsg,LogSeverity::Info);
}
return ;
}
catch (const std::exception& e)
{
strmsg= "------mysqldb--::closeDB Exception";
strmsg +=e.what();
LogManager::logCMN(strmsg,LogSeverity::Info);
return ;
}
catch (...)
{
QString strmsg= "---Function:closeDB Exception";
LogManager::logCMN(strmsg,LogSeverity::Info);
return ;
}
return ;
}
bool mysqldb::isConnected() const
{
QString strmsg,errMsg;
try {
return m_db.isOpen() && m_db.isValid();
}
catch (const std::exception& e)
{
QString strmsg= "CSU_fmeteorandpower---mysqldb::isConnected() Exception:";
strmsg +=e.what();
//qDebug()<<strmsg;
LogManager::logCMN(strmsg,LogSeverity::Error);
}
catch (...) {
QString strmsg = "CSU_fmeteorandpower---mysqldb::isConnected()---Exception";
//qDebug()<<strmsg;
LogManager::logCMN(strmsg,LogSeverity::Error);
}
}
bool mysqldb::executeQuery(const QString& sql)
{
QString strmsg,errMsg;
try {
// 执行查询前先检查连接状态
if (!isConnected())
{
strmsg = "CSU_fmeteorandpower---mysqldb::executeQuery---connect---fail";
LogManager::logCMN(strmsg,LogSeverity::Info);
if (!connectDB())
{
strmsg = "CSU_fmeteorandpower---mysqldb::executeQuery---reconnect---fail";
LogManager::logCMN(strmsg,LogSeverity::Info);
return false;
}
}
// 执行SQL查询
if (m_query.exec(sql))
{
return true;
}
else
{
strmsg = "CSU_fmeteorandpower---mysqldb::executeQuery---sql=";
strmsg +=sql;
strmsg +="fail---error=";
strmsg +=m_query.lastError().text();
// 如果是连接错误,尝试重新连接
if (m_query.lastError().type() == QSqlError::ConnectionError)
{
strmsg = "CSU_fmeteorandpower---mysqldb::executeQuery";
strmsg +="connect fail,reconnect";
LogManager::logCMN(strmsg,LogSeverity::Info);
setquery();
connectDB();
}
return false;
}
}
catch (const std::exception& e)
{
QString strmsg= "CSU_fmeteorandpower---mysqldb::executeQuery() Exception:";
strmsg +=e.what();
//qDebug()<<strmsg;
LogManager::logCMN(strmsg,LogSeverity::Error);
}
catch (...) {
QString strmsg = "CSU_fmeteorandpower---mysqldb::executeQuery()---Exception";
//qDebug()<<strmsg;
LogManager::logCMN(strmsg,LogSeverity::Error);
}
}
3.调用示例
3.1 数据库初始化+连接+实例化查询-关闭数据库
cpp
//1.数据库连接与设置
mysqldb m_mysqldb;
m_mysqldb.m_dbhost="192.168.9.73";
m_mysqldb.m_dbport="3306";
m_mysqldb.m_dbuser="root";
m_mysqldb.m_dbpassword="INT@4001093999";
m_mysqldb.m_connname="mytest";
m_mysqldb.initDB();
m_mysqldb.connectDB();
m_mysqldb.setquery();
//2.数据库表的操作
QMap<QString,QString> m_forecast_weathers;
QString tablename;
m_forecast_weathers["forecast_time"]="forecast_time";
m_forecast_weathers["data_time"]="data_time";
m_forecast_weathers["temperature"]="temperature";
m_forecast_weathers["inverter_tem"]="inverter_tem";
tablename="forecast_weather";
if(!m_mysqldb.tableExists(tablename)) //如果表不存在
{
m_mysqldb.createTable(tablename, m_forecast_weathers);//创建表
}
else if(!m_mysqldb.columnsMatch(tablename, m_forecast_weathers))//如果存在 判断列名是否需要修改
{
m_mysqldb.updateTable(tablename, m_forecast_weathers);
}
m_mysqldb.updateTableData(tablename, m_forecast_weathers);
3.2 执行sql语句
cpp
if(!m_mysqldb.m_db.isOpen())
{
msg= "---CSU_fmeteorandpower::checktableCalpara()! do not open";
LogManager::logCMN(msg, LogSeverity::Info);
m_mysqldb.closeDB();
m_mysqldb.initDB();
m_mysqldb.connectDB();
m_mysqldb.setquery();
m_mysqldb.m_db.open();
}
if(m_mysqldb.m_db.isOpen())
{
sql=" SELECT 1 FROM information_schema.tables WHERE table_schema = 'pvfforecast' AND table_name = 'cal_paras' LIMIT 1;";
m_mysqldb.executeQuery(sql);
if (m_mysqldb.m_query.next())
{
msg= "---CSU_fmeteorandpower:: cal_paras already exist----------------------";
LogManager::logCMN(msg, LogSeverity::Info);
//qDebug() << msg;
return true;
}
// 创建表
QString createTableSql =
"CREATE TABLE `cal_paras` ("
"`id` int NOT NULL,"
"`curtime` datetime NULL DEFAULT NULL,"
"`cal_ill_m_φ` varchar(255) DEFAULT NULL,"
"`cal_power_DEFAULT_INI_f_Tw` varchar(255) DEFAULT NULL,"
"PRIMARY KEY (`id`) USING BTREE"
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;";
if (!m_mysqldb.m_query.exec(createTableSql))
{
msg= "---CSU_fmeteorandpower:: create cal_paras fail!";
msg+=m_mysqldb.m_query.lastError().text();
LogManager::logCMN(msg, LogSeverity::Info);
return false;
}
msg= "---CSU_fmeteorandpower:: create cal_paras successful!";
LogManager::logCMN(msg, LogSeverity::Info);
return true;
}
else
{
msg= "---CSU_fmeteorandpower:: create cal_paras fail!";
msg+=m_mysqldb.m_query.lastError().text();
LogManager::logCMN(msg, LogSeverity::Info);
return false;
}
3.3处理查询到的数据
cpp
// 3.处理查询结果
QString str;
int i = 0;
while (query.next())
{
str = query.value("temperature").toString();
if (!str.isEmpty()) {
m_temperatures.append(str); // 温度
}
}