數據庫做爲數據源,在不少組態軟件中使用很是多,指定數據庫類型,填寫好數據庫鏈接信息,指定對應的數據庫表和字段,採集間隔,程序按照採集間隔自動採集數據庫數據,綁定到界面上的控件賦值顯示便可。使用數據庫做爲數據源,有個很是大的好處就是不用去寫額外的通訊代碼,也與對方的什麼語言什麼平臺無關,不會有扯皮的事情發生,例如通訊協議不規範不許確致使解析不對的狀況啊,這樣就支持任意的語言和平臺啦,畢竟有數據庫這個中間載體過渡,並且任何語言任何平臺都會有數據庫,都兼容,因此採用數據庫做爲數據源不失爲一種很好的方案,能夠專一於軟件功能的持續集成。mysql
體驗地址:https://pan.baidu.com/s/1A5Gd77kExm8Co5ckT51vvQ 提取碼:877p 文件:可執行文件.ziplinux
void frmData::initServer() { //實例化串口類,綁定信號槽 com = new QextSerialPort(QextSerialPort::EventDriven, this); connect(com, SIGNAL(readyRead()), this, SLOT(readDataCom())); //實例化網絡通訊客戶端類,綁定信號槽 tcpClient = new QTcpSocket(this); connect(tcpClient, SIGNAL(readyRead()), this, SLOT(readDataClient())); //實例化網絡通訊服務端類,綁定信號槽 tcpSocket = NULL; tcpServer = new QTcpServer(this); connect(tcpServer, SIGNAL(newConnection()), this, SLOT(newConnection())); //開啓定時器讀取數據庫採集數據 timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(readDataDb())); timer->setInterval(1000); } void frmData::on_btnOpenDb_clicked() { if (ui->btnOpenDb->text() == "打開") { if (App::DbType == "sqlite") { //先檢查數據庫文件是否存在 QString dbPath = qApp->applicationDirPath() + "/" + App::DbPath; QFile file(dbPath); if (file.size() == 0) { return; } dbConn = QSqlDatabase::addDatabase("QSQLITE"); dbConn.setDatabaseName(dbPath); } else if (App::DbType == "mysql") { //先檢查數據庫服務器IP是否通,不檢查直接鏈接,不存在的IP會卡好久 QTcpSocket socket; socket.connectToHost(App::DbPath, App::DbPort); if (!socket.waitForConnected(2000)) { return; } else { socket.disconnectFromHost(); } dbConn = QSqlDatabase::addDatabase("QMYSQL"); dbConn.setHostName(App::DbPath); dbConn.setPort(App::DbPort); dbConn.setDatabaseName(App::DbName); dbConn.setUserName(App::DbUser); dbConn.setPassword(App::DbPwd); } else { //暫未支持其餘數據庫,能夠自行加入 return; } bool ok = dbConn.open(); if (ok) { setEnable(ui->btnOpenDb, false); ui->btnOpenDb->setText("關閉"); timer->start(); } } else { if (dbConn.isOpen()) { dbConn.close(); } setEnable(ui->btnOpenDb, true); ui->btnOpenDb->setText("打開"); timer->stop(); } } void frmData::readDataDb() { QString sql = QString("select %1 from %2").arg(App::DbColumn).arg(App::DbTable); QSqlQuery query; if (query.exec(sql)) { if (query.next()) { double value = query.value(0).toDouble(); ui->txtValue->setText(QString::number(value)); append(4, QString("當前值: %1").arg(value)); } } }