服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - Qt数据库应用之实现通用数据库采集

Qt数据库应用之实现通用数据库采集

2022-10-25 13:56feiyangqingyun C/C++

这篇文章主要为大家介绍了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

四、效果图

Qt数据库应用之实现通用数据库采集

五、相关代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
#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<int> 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数据库应用之实现通用数据库采集的文章就介绍到这了,更多相关Qt数据库采集内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/feiyangqingyun/article/details/123627249

延伸 · 阅读

精彩推荐