QT-mysql-初始化-链接-查询

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); // 温度
                            }
}