Qt數(shù)據(jù)庫應(yīng)用之實現(xiàn)通用數(shù)據(jù)庫請求
一、前言
數(shù)據(jù)庫請求是在數(shù)據(jù)庫采集的基礎(chǔ)上,換成http請求的形式來獲取數(shù)據(jù),這樣就脫離了數(shù)據(jù)庫組件,而采用的通用的http請求的形式從數(shù)據(jù)庫拿數(shù)據(jù)庫,這個通用性就非常廣泛了,比如對方用java采集到設(shè)備的數(shù)據(jù)存入數(shù)據(jù)庫,另外一個區(qū)域是用的c#采集的數(shù)據(jù)入庫,然后統(tǒng)一規(guī)則統(tǒng)一規(guī)范約定一個請求機(jī)制,定時器或者線程取執(zhí)行請求,拿到的json數(shù)據(jù),挨個取出來結(jié)果,數(shù)組集合的方式發(fā)信號出去。
之前寫過的可視化大屏電子看板程序,采用的也是http請求數(shù)據(jù)庫采集的方式拿數(shù)據(jù)展示,需要多方協(xié)作,至于數(shù)據(jù)庫中的數(shù)據(jù)是誰放的,和大屏程序本身無關(guān),對應(yīng)既可以是請求的形式存入的數(shù)據(jù),也可以是直接數(shù)據(jù)庫寫入的方式,即可以是java也可以是c#,大屏UI展示只管取出數(shù)據(jù)按照規(guī)則展示即可,要多漂亮就多漂亮,qss和painter在手,心中有坐標(biāo),萬物皆painter。
關(guān)于Qt數(shù)據(jù)庫相關(guān)開發(fā)的一些經(jīng)驗總結(jié)
二、功能特點
同時支持多種數(shù)據(jù)庫比如odbc、sqlite、mysql、postgresql、sqlserver、oracle、人大金倉等。
一個數(shù)據(jù)庫類即可管理本地數(shù)據(jù)庫通信,也支持遠(yuǎn)程數(shù)據(jù)庫通信等。
數(shù)據(jù)庫線程支持執(zhí)行各種sql語句,包括單條和批量。
組件中的所有類打印信息、錯誤信息、執(zhí)行結(jié)果都信號發(fā)出去。
集成數(shù)據(jù)庫通用翻頁類(負(fù)責(zé)具體處理邏輯),搭配分頁導(dǎo)航控件(負(fù)責(zé)外觀),形成超級牛逼的翻頁控件。
集成數(shù)據(jù)庫自動清理類,設(shè)定最大記錄數(shù)后臺自動清理早期數(shù)據(jù)。
集成自定義委托類,支持復(fù)選框、文本框、下拉框、日期框、微調(diào)框、進(jìn)度條等。
同時支持Qt4-Qt6,親測Qt4.6到Qt6.3任意版本,任意系統(tǒng)和編譯器。
本組件無故障 360天7乘24小時 運行在至少上萬個現(xiàn)場,商業(yè)級別品質(zhì)保證。
每個類都對應(yīng)完整詳細(xì)的使用示例,注釋詳細(xì),非常適合閱讀學(xué)習(xí)。
可以作為獨立的程序運行,比如自動清理早期數(shù)據(jù),同步數(shù)據(jù)到云端。
全部線程處理,不卡界面,自動重連數(shù)據(jù)庫。
普通測試情況,sqlite數(shù)據(jù)庫,數(shù)據(jù)庫發(fā)生器每秒鐘插入1000條記錄約0.003秒鐘,同時自動清理數(shù)據(jù)類每秒鐘刪除1000條記錄約0.13秒,不同線程互不干擾。
三、體驗地址
體驗地址:https://pan.baidu.com/s/15ZKAlptW-rDcNq8zlzdYLg 提取碼:uyes 文件名:bin_dbtool.zip
國內(nèi)站點:https://gitee.com/feiyangqingyun
國際站點:https://github.com/feiyangqingyun
四、效果圖
五、相關(guān)代碼
#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())); //實例化網(wǎng)絡(luò)請求采集數(shù)據(jù)通信類 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))); //設(shè)置參數(shù) 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 << "位號" << "當(dāng)前值" << "狀態(tài)" << "時間"; 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 秒) 標(biāo)識( %2 ) 數(shù)據(jù)( %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() == "啟動服務(wù)") { on_btnDo_clicked(); timer->start(); ui->btnStart->setText("停止服務(wù)"); } else { timer->stop(); ui->btnStart->setText("啟動服務(wù)"); } } void frmDbHttp::on_btnClear_clicked() { QUIHelper::appendMsg(ui->txtMain, 0, "", maxCount, currentCount); }
以上就是Qt數(shù)據(jù)庫應(yīng)用之實現(xiàn)通用數(shù)據(jù)庫請求的詳細(xì)內(nèi)容,更多關(guān)于Qt數(shù)據(jù)庫請求的資料請關(guān)注腳本之家其它相關(guān)文章!
- Qt數(shù)據(jù)庫應(yīng)用之實現(xiàn)通用數(shù)據(jù)庫采集
- Qt數(shù)據(jù)庫應(yīng)用之通用數(shù)據(jù)庫同步
- Qt數(shù)據(jù)庫應(yīng)用之超級自定義委托
- Qt數(shù)據(jù)庫應(yīng)用之實現(xiàn)通用數(shù)據(jù)庫分頁
- Qt數(shù)據(jù)庫應(yīng)用之實現(xiàn)通用數(shù)據(jù)庫清理
- Qt數(shù)據(jù)庫相關(guān)應(yīng)用開發(fā)總結(jié)
- Qt數(shù)據(jù)庫應(yīng)用之實現(xiàn)通用數(shù)據(jù)生成器
- Qt數(shù)據(jù)庫應(yīng)用之實現(xiàn)數(shù)據(jù)圖文混排
相關(guān)文章
如何使用C語言將數(shù)字、字符等數(shù)據(jù)寫入、輸出到文本文件中
在分析數(shù)據(jù)時,首先要解決數(shù)據(jù)的保存問題,下面這篇文章主要給大家介紹了關(guān)于如何使用C語言將數(shù)字、字符等數(shù)據(jù)寫入、輸出到文本文件中的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06C語言數(shù)據(jù)結(jié)構(gòu)之堆排序源代碼
這篇文章主要為大家詳細(xì)介紹了C語言數(shù)據(jù)結(jié)構(gòu)之堆排序源代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01VC++實現(xiàn)View內(nèi)容保存為圖片的方法
這篇文章主要介紹了VC++實現(xiàn)View內(nèi)容保存為圖片的方法,涉及VC++中Bitmap類的save方法相關(guān)使用技巧,需要的朋友可以參考下2016-08-08