Qt資料庫應用17-通用資料庫請求
阿新 • • 發佈:2022-03-22
一、前言
資料庫請求是在資料庫採集的基礎上,換成http請求的形式來獲取資料,這樣就脫離了資料庫元件,而採用的通用的http請求的形式從資料庫拿資料庫,這個通用性就非常廣泛了,比如對方用java採集到裝置的資料存入資料庫,另外一個區域是用的c#採集的資料入庫,然後統一規則統一規範約定一個請求機制,定時器或者執行緒取執行請求,拿到的json資料,挨個取出來結果,陣列集合的方式發訊號出去。
之前寫過的視覺化大屏電子看板程式,採用的也是http請求資料庫採集的方式拿資料展示,需要多方協作,至於資料庫中的資料是誰放的,和大屏程式本身無關,對應既可以是請求的形式存入的資料,也可以是直接資料庫寫入的方式,即可以是java也可以是c#,大屏UI展示只管取出資料按照規則展示即可,要多漂亮就多漂亮,qss和painter在手,心中有座標,萬物皆painter。
關於Qt資料庫相關開發的一些經驗總結:
https://qtchina.blog.csdn.net/article/details/119022424
二、功能特點
- 同時支援多種資料庫比如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/1ZxG-oyUKe286LPMPxOrO2A
- 國內站點:https://gitee.com/feiyangqingyun
- 國際站點:https://github.com/feiyangqingyun
- 個人主頁:https://blog.csdn.net/feiyangqingyun
- 知乎主頁:https://www.zhihu.com/people/feiyangqingyun/
四、效果圖
五、相關程式碼
#include "frmdbhttp.h"
#include "ui_frmdbhttp.h"
#include "quihelper.h"
#include "dbhelper.h"
#include "dbhttpthread.h"
frmDbHttp::frmDbHttp(QWidget *parent) : QWidget(parent), ui(new Ui::frmDbHttp)
{
ui->setupUi(this);
this->initForm();
this->initConfig();
this->initTable();
}
frmDbHttp::~frmDbHttp()
{
delete ui;
}
void frmDbHttp::showEvent(QShowEvent *)
{
static bool isShow = false;
if (!isShow) {
isShow = true;
QTimer::singleShot(100, this, SLOT(on_btnStart_clicked()));
}
}
void frmDbHttp::initForm()
{
ui->frame->setFixedWidth(AppConfig::RightWidth);
QUIHelper::initTableView(ui->tableWidget);
maxCount = 100;
currentCount = 0;
timer = new QTimer(this);
timer->setInterval(1000);
connect(timer, SIGNAL(timeout()), this, SLOT(on_btnDo_clicked()));
//例項化網路請求採集資料通訊類
dbHttp = new DbHttpThread(this);
connect(dbHttp, SIGNAL(debug(QString)), this, SLOT(debug(QString)));
connect(dbHttp, SIGNAL(error(QString)), this, SLOT(error(QString)));
connect(dbHttp, SIGNAL(receiveData(QString, QStringList, int)), this, SLOT(receiveData(QString, QStringList, int)));
//設定引數
dbHttp->setUrl("http://127.0.0.1:6000");
QMap<QString, QString> tables;
tables.insert("NodeData", "PositionID,NodeValue,NodeStatus,SaveTime");
dbHttp->setTables(tables);
}
void frmDbHttp::initConfig()
{
}
void frmDbHttp::saveConfig()
{
}
void frmDbHttp::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 frmDbHttp::debug(const QString &msg)
{
QUIHelper::appendMsg(ui->txtMain, 0, msg, maxCount, currentCount);
}
void frmDbHttp::error(const QString &msg)
{
QUIHelper::appendMsg(ui->txtMain, 1, msg, maxCount, currentCount);
}
void frmDbHttp::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 frmDbHttp::on_btnDo_clicked()
{
dbHttp->select("NodeData", "PositionID,NodeValue,NodeStatus,SaveTime");
}
void frmDbHttp::on_btnStart_clicked()
{
if (ui->btnStart->text() == "啟動服務") {
on_btnDo_clicked();
timer->start();
ui->btnStart->setText("停止服務");
} else {
timer->stop();
ui->btnStart->setText("啟動服務");
}
}
void frmDbHttp::on_btnClear_clicked()
{
QUIHelper::appendMsg(ui->txtMain, 0, "", maxCount, currentCount);
}