千家信息网

Qt数据库应用中如何实现通用数据库采集

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,小编给大家分享一下Qt数据库应用中如何实现通用数据库采集,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、前言数据库采集对
千家信息网最后更新 2026年11月03日Qt数据库应用中如何实现通用数据库采集

小编给大家分享一下Qt数据库应用中如何实现通用数据库采集,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

一、前言

数据库采集对应的就是上一篇文章的数据库同步,数据库同步到云端数据库以后,app、网页、小程序啥的要数据的话,可以通过执行http请求拿到数据,http接收应答这边程序一般最简单可以用php写,几行代码即可,比如根据请求的参数构建需要执行的sql语句,执行以后将结果json形式返回即可。

通过Qt程序去做数据库采集有多种方式,即可直接连接数据库然后绑定数据库表到QSqlTableModel,然后不断调用select方法查询刷新界面即可,也可通过执行sql语句的形式,通过sql语句的形式更灵活,可以先拿到数据结果集合,然后过滤,比如判断是否报警了,是否需要执行其他指令动作,然后再将需要的数据信号的形式发出去,需要的地方关联信号拿到数据展示即可,相当于做了一层筛选。

数据库通信管理线程类特点:

  1. 可设置数据库类型,支持多种数据库类型。

  2. 数据库类型包括但不限于odbc、sqlite、mysql、postgresql、sqlserver、oracle、人大金仓等。

  3. 可设置数据库连接信息包括主机地址、用户信息等。

  4. 具有自动重连机制,可设置是否检查连接以及检查间隔。

  5. 支持单条sql语句队列,一般用于查询返回数据,每次插入一条执行一条。

  6. 支持多条sql语句队列,一般用于远程提交数据,每次插入一条执行多条。

  7. 支持批量sql语句队列,一般用于批量更新数据,每次插入多条执行多条。

  8. 可设置队列最大数量,限定排队处理的sql语句集合。

  9. 通过信号发出 打印信息、错误信息、查询结果。

关于Qt数据库相关开发的一些经验总结

二、功能特点

同时支持多种数据库比如odbc、sqlite、mysql、postgresql、sqlserver、oracle、人大金仓等。

一个数据库类即可管理本地数据库通信,也支持远程数据库通信等。

数据库线程支持执行各种sql语句,包括单条和批量。

组件中的所有类打印信息、错误信息、执行结果都信号发出去。

集成数据库通用翻页类(负责具体处理逻辑),搭配分页导航控件(负责外观),形成超级牛逼的翻页控件。

集成数据库自动清理类,设定最大记录数后台自动清理早期数据。

集成自定义委托类,支持复选框、文本框、下拉框、日期框、微调框、进度条等。

同时支持Qt4-Qt6,亲测Qt4.6到Qt6.3任意版本,任意系统和编译器。

本组件无故障 360天7乘24小时 运行在至少上万个现场,商业级别品质保证。

每个类都对应完整详细的使用示例,注释详细,非常适合阅读学习。

可以作为独立的程序运行,比如自动清理早期数据,同步数据到云端。

全部线程处理,不卡界面,自动重连数据库。

普通测试情况,sqlite数据库,数据库发生器每秒钟插入1000条记录约0.003秒钟,同时自动清理数据类每秒钟删除1000条记录约0.13秒,不同线程互不干扰。

三、体验地址

体验地址:https://pan.baidu.com/s/15ZKAlptW-rDcNq8zlzdYLg 提取码:uyes 文件名:bin_dbtool.zip

国内站点:https://gitee.com/feiyangqingyun

国际站点:https://github.com/feiyangqingyun

四、效果图

五、相关代码

#include "frmdbdownload.h"#include "ui_frmdbdownload.h"#include "quihelper.h"#include "dbconnthread.h"frmDbDownload::frmDbDownload(QWidget *parent) : QWidget(parent), ui(new Ui::frmDbDownload){    ui->setupUi(this);    this->initForm();    this->initConfig();    this->initTable();}frmDbDownload::~frmDbDownload(){    delete ui;}void frmDbDownload::initForm(){    ui->frame->setFixedWidth(AppConfig::RightWidth);    QUIHelper::initTableView(ui->tableWidget);    maxCount = 100;    currentCount = 0;    columnCount = 0;    timer = new QTimer(this);    timer->setInterval(1000);    connect(timer, SIGNAL(timeout()), this, SLOT(on_btnDo_clicked()));    //实例化数据库通信类    dbConn = new DbConnThread(this);    dbConn->setDbFlag("云端");    connect(dbConn, SIGNAL(debug(QString)), this, SLOT(debug(QString)));    connect(dbConn, SIGNAL(error(QString)), this, SLOT(error(QString)));    connect(dbConn, SIGNAL(receiveData(QString, QStringList, int)), this, SLOT(receiveData(QString, QStringList, int)));}void frmDbDownload::initConfig(){    ui->cboxDbType->addItems(DbHelper::getDbType());    ui->cboxDbType->setCurrentIndex(ui->cboxDbType->findText(AppConfig::DbType6));    connect(ui->cboxDbType, SIGNAL(currentIndexChanged(int)), this, SLOT(saveConfig()));    ui->txtDbName->setText(AppConfig::DbName6);    connect(ui->txtDbName, SIGNAL(textChanged(QString)), this, SLOT(saveConfig()));    ui->txtHostName->setText(AppConfig::HostName6);    connect(ui->txtHostName, SIGNAL(textChanged(QString)), this, SLOT(saveConfig()));    ui->txtHostPort->setText(QString::number(AppConfig::HostPort6));    connect(ui->txtHostPort, SIGNAL(textChanged(QString)), this, SLOT(saveConfig()));    ui->txtUserName->setText(AppConfig::UserName6);    connect(ui->txtUserName, SIGNAL(textChanged(QString)), this, SLOT(saveConfig()));    ui->txtUserPwd->setText(AppConfig::UserPwd6);    connect(ui->txtUserPwd, SIGNAL(textChanged(QString)), this, SLOT(saveConfig()));}void frmDbDownload::saveConfig(){    AppConfig::DbType6 = ui->cboxDbType->currentText();    AppConfig::DbName6 = ui->txtDbName->text();    AppConfig::HostName6 = ui->txtHostName->text();    AppConfig::HostPort6 = ui->txtHostPort->text().toInt();    AppConfig::UserName6 = ui->txtUserName->text();    AppConfig::UserPwd6 = ui->txtUserPwd->text();    AppConfig::writeConfig();}void frmDbDownload::initTable(){    QStringList columnNames;    columnNames << "位号" << "当前值" << "状态" << "时间";    QList columnWidths;    columnWidths << 160 << 100 << 100 << 220;    columnCount = columnNames.count();    ui->tableWidget->setColumnCount(columnCount);    ui->tableWidget->setHorizontalHeaderLabels(columnNames);    for (int i = 0; i < columnCount; i++) {        ui->tableWidget->setColumnWidth(i, columnWidths.at(i));    }}void frmDbDownload::debug(const QString &msg){    QUIHelper::appendMsg(ui->txtMain, 0, msg, maxCount, currentCount);}void frmDbDownload::error(const QString &msg){    QUIHelper::appendMsg(ui->txtMain, 1, msg, maxCount, currentCount);}void frmDbDownload::receiveData(const QString &tag, const QStringList &data, int msec){    QString msg = QString("用时( %1 秒)  标识( %2 )  数据( %3 )").arg(QString::number((double)msec / 1000, 'f', 3)).arg(tag).arg(data.join("|"));    QUIHelper::appendMsg(ui->txtMain, 3, msg, maxCount, currentCount);    //显示到表格中    int count = data.count();    ui->tableWidget->setRowCount(count / columnCount);    int row = -1;    for (int i = 0; i < count; i = i + columnCount) {        row++;        for (int j = 0; j < columnCount; ++j) {            ui->tableWidget->setItem(row, j, new QTableWidgetItem(data.at(i + j)));        }    }}void frmDbDownload::on_btnOpen_clicked(){    if (ui->btnOpen->text() == "打开数据库") {        DbInfo dbInfo;        dbInfo.connName = this->objectName();        dbInfo.dbName = AppConfig::DbName6;        dbInfo.hostName = AppConfig::HostName6;        dbInfo.hostPort = AppConfig::HostPort6;        dbInfo.userName = AppConfig::UserName6;        dbInfo.userPwd = AppConfig::UserPwd6;        QString dbType = AppConfig::DbType6.toUpper();        if (dbType == "SQLITE") {            dbInfo.dbName = DbHelper::getDbDefaultFile();        }        dbConn->setConnInfo(DbHelper::getDbType(dbType), dbInfo);        if (dbConn->openDb()) {            dbConn->start();            ui->btnOpen->setText("关闭数据库");        } else {            QString error = dbConn->getDatabase().lastError().text();            QUIHelper::showMessageBoxError("打开数据库失败!\n" + error, 3);        }    } else {        dbConn->stop();        dbConn->closeDb();        ui->btnOpen->setText("打开数据库");        on_btnClear_clicked();    }    QTimer::singleShot(1000, this, SLOT(on_btnStart_clicked()));}void frmDbDownload::on_btnCopy_clicked(){    //将数据库设置参数一键粘贴过来    ui->cboxDbType->setCurrentIndex(ui->cboxDbType->findText(AppConfig::LocalDbType));    ui->txtDbName->setText(AppConfig::LocalDbName);    ui->txtHostName->setText(AppConfig::LocalHostName);    ui->txtHostPort->setText(QString::number(AppConfig::LocalHostPort));    ui->txtUserName->setText(AppConfig::LocalUserName);    ui->txtUserPwd->setText(AppConfig::LocalUserPwd);}void frmDbDownload::on_btnDo_clicked(){    if (!dbConn->getOk()) {        return;    }    dbConn->select("NodeData", "PositionID,NodeValue,NodeStatus,SaveTime");}void frmDbDownload::on_btnStart_clicked(){    if (ui->btnStart->text() == "启动服务") {        on_btnDo_clicked();        timer->start();        ui->btnStart->setText("停止服务");    } else {        timer->stop();        ui->btnStart->setText("启动服务");    }}void frmDbDownload::on_btnClear_clicked(){    QUIHelper::appendMsg(ui->txtMain, 0, "", maxCount, currentCount);}

以上是"Qt数据库应用中如何实现通用数据库采集"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

数据 数据库 支持 语句 信息 信号 多条 形式 程序 篇文章 线程 结果 队列 可设 通信 云端 同时 地址 多种 类型 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 南京欣网互联网络科技有限公司 互联网科技巨头监管 疫情对互联网科技公司影响 唐信互联网科技 大连 上海万想互联网科技 互联网前沿科技 一五八零互联网科技 互联网科技咨询 佰商互联网科技有限公司 互联网汽车科技小镇 青岛中康互联网医疗科技有限公司 深圳前海聚择互联网科技有限公司 天速互联网络科技有限公司 中国互联网有什么科技含量 济南有互联网科技公司吗 福州德业互联网科技 艺电能源互联网科技有限公司招聘 三亚科技创新互联网基地 恒生互联网科技趋势 恒生科技互联网指数十大成分股 互联网高科技股票 人人互联网科技是培训 玖二柒互联网科技公司待遇 北京华百购互联网科技有限公司 昭通云南众福互联网科技有限公司 南山科技园互联网公司有哪些 互联网还是高科技吗 从那以后互联网科技有限公司 云南互联网科技学费 马化腾互联网科技教学
0