Qt5数据库
?對于習慣使用SQL語法的用戶,QSqlQuery類提供了直接執行SQL語句并處理返回結果的方法。對于習慣使用較高層數據庫接口避免使用SQL語句的用戶,QSqlTableModel類和QSqlRelationalTableModel類則提供了合適的抽象。
?-->可視化操作數據庫
?Qt 不僅提供了這種使用 SQL 語句的方式,還提供了一種基于模型的更高級的處理方式。這種基于QSqlTableModel 的模型處理更為高級,如果對 SQL 語句不熟悉,并且不需要很多復雜的查詢,這種QSqlTableModel模型基本可以滿足一般的需求。即使用可以不懂sql語句都可以操作的類,來操作數據庫。
-----> 需要自己補充SQL語法等內容
?數據庫連接由任意字符串標識。在沒有指定連接的情況下,QSqlDatabase可以提供默認連接供Qt其他的SQL類使用。建立一條數據庫連接的代碼如下:
//以QSQLITE為數據庫類型,在本進程地址控件創建一個SQLite數據庫QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");db.setHostName("easybook-3313b0"); //設置數據庫主機名db.setDatabaseName("qtDB.db"); //設置數據庫名db.setUserName("zhouhejun"); //設置數據庫用戶名db.setPassword("123456"); //設置數據庫密碼db.open(); //打開連接?靜態函數QSqlDatabase::addDatabase()帶有兩個參數,第一個參數為驅動名,第二個參數為連接名,缺省值為默認連接。這個函數返回一條新建立的數據庫連接。如果連接名connectionName沒有指定,新建立的數據庫連接將成為本程序的默認連接,并且可以被后續不帶參數的函數database()引用。如果指定了連接名connectionName,函數database(connectionName)將獲取這個數據庫連接。
static QSqlDatabase addDatabase(QSqlDriver* driver,const QString& connectionName = QLatin1String(defaultConnection));DEMO
pro文件
#------------------------------------------------- # # Project created by QtCreator 2018-10-18T11:24:48 # #-------------------------------------------------QT += core gui QT += sqlgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = CH1301 TEMPLATE = appSOURCES += main.cpp\dialog.cppHEADERS += dialog.hFORMS += dialog.uidialog.h
#ifndef DIALOG_H #define DIALOG_H#include <QDialog> #include <QString> #include <QSqlError> #include <QSqlDatabase> #include <QString> #include <QTime> #include <QSqlQuery> #include <QDebug> #include <QSqlRecord>namespace Ui { class Dialog; }class Dialog : public QDialog {Q_OBJECTpublic:explicit Dialog(QWidget *parent = 0);~Dialog();QString driverName() const;QString databaseName() const;QString userName() const;QString password() const;QString hostName() const;int port() const;QSqlError addConnection(const QString &driver,const QString &dbName,const QString &host,const QString &user,const QString &passwd,int port = -1);void creatSqliteDB();private slots:void on_cancel_pushButton_clicked();void on_ok_pushButton_clicked();void driverChanged(const QString &text);private:Ui::Dialog *ui; };#endif // DIALOG_Hdialog.cpp
#include "dialog.h" #include "ui_dialog.h"Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog) {ui->setupUi(this);QStringList drivers = QSqlDatabase::drivers();ui->drivercomboBox->addItems(drivers);connect(ui->drivercomboBox,SIGNAL(currentIndexChanged(QString)),this,SLOT(driverChanged(QString)));ui->statuslabel->setText(tr("準備連接數據庫!")); }Dialog::~Dialog() {delete ui; }void Dialog::driverChanged(const QString &text) {if(text == "QSQLITE"){ui->datebaselineEdit->setEnabled(false);ui->userNamelineEdit->setEnabled(false);ui->hostnamelineEdit->setEnabled(false);ui->passwordlineEdit->setEnabled(false);ui->portspinBox->setEnabled(false);}else{ui->datebaselineEdit->setEnabled(true);ui->userNamelineEdit->setEnabled(true);ui->hostnamelineEdit->setEnabled(true);ui->passwordlineEdit->setEnabled(true);ui->portspinBox->setEnabled(true);} }void Dialog::on_cancel_pushButton_clicked() {close(); }QString Dialog::driverName() const {return ui->drivercomboBox->currentText(); }QString Dialog::databaseName() const {return ui->datebaselineEdit->text(); }QString Dialog::hostName() const {return ui->hostnamelineEdit->text(); }QString Dialog::userName() const {return ui->userNamelineEdit->text(); }QString Dialog::password() const {return ui->passwordlineEdit->text(); }int Dialog::port() const {return ui->portspinBox->value();}QSqlError Dialog::addConnection(const QString &driver, const QString &dbName, const QString &host, const QString &user,const QString &passwd, int port) {static int cCount = 0;QSqlError err;QSqlDatabase db = QSqlDatabase::addDatabase(driver,QString("conn%1").arg(++cCount));db.setHostName(dbName);db.setDatabaseName(dbName);db.setPort(port);if(!db.open(user,passwd)){err = db.lastError();db = QSqlDatabase();QSqlDatabase::removeDatabase(QString("conn%1").arg(cCount));}return err; } /** 描述:* 輸入:* 輸出:* 返回值:* 其他: */ void Dialog::creatSqliteDB() {//以QSQLITE為數據庫類型,在本進程地址控件創建一個SQLite數據庫QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");db.setHostName("easybook-3313b0"); //設置數據庫主機名db.setDatabaseName("qtDB.db"); //設置數據庫名db.setUserName("zhouhejun"); //設置數據庫用戶名db.setPassword("123456"); //設置數據庫密碼db.open(); //打開連接if(!db.open()){ui->statuslabel->setText(db.lastError().text());return ;}//創建數據庫表QSqlQuery query;bool success=query.exec("create table automobil(id int primary key,attribute varchar,type varchar,kind varchar,nation int,carnumber int,elevaltor int,distance int,oil int,temperature int)");if(success){qDebug() << "數據庫創建成功!" << endl;}else{qDebug() << "數據庫創建失敗!" << endl;return ;}//查詢query.exec("select * from automobil");QSqlRecord rec = query.record();qDebug() << "atuomobil 表字段數: " << rec.count();//插入記錄QTime t; //啟動一個定時器,統計操作耗時t.start();query.prepare("insert into automobil values(?,?,?,?,?,?,?,?,?,?)");long records = 100; //向表中任意的插入100條記錄for(int i = 0;i < records;i++){query.bindValue(0,i);query.bindValue(1,"四輪");query.bindValue(2,"轎車");query.bindValue(3,"富康");query.bindValue(4,rand()%100);query.bindValue(5,rand()%10000);query.bindValue(6,rand()%300);query.bindValue(7,rand()%200000);query.bindValue(8,rand()%52);query.bindValue(9,rand()%100);success=query.exec();if(!success){QSqlError lastError = query.lastError();qDebug() << lastError.driverText() << "插入失敗" <<endl;}}qDebug() << QObject::tr("插入 %1 條記錄,耗時 %2 ms").arg(records).arg(t.elapsed());//排序t.restart(); //重啟計數器//按id字段的降序將查詢表中剛剛插入的100條記錄進行排序success = query.exec("select * from automobil order by id desc");if(success){qDebug() << QObject::tr("排序 %1 條記錄,耗時 %2 ms").arg(records).arg(t.elapsed());}else{qDebug() << "排序失敗!\n";}//刪除t.restart();query.exec("delete from automobil where id=15"); //執行刪除id為15的記錄的操作//輸出耗時qDebug() << QObject::tr("刪除一條記錄,耗時 %1 ms").arg(t.elapsed());return ; }void Dialog::on_ok_pushButton_clicked() {if(ui->drivercomboBox->currentText().isEmpty()){ui->statuslabel->setText(tr("請選擇一個數據庫驅動"));}else if(ui->drivercomboBox->currentText() == "QSQLITE"){creatSqliteDB(); // accept();}else{QSqlError err = addConnection(driverName(),databaseName(),hostName(),userName(),password(),port());if(err.type() != QSqlError::NoError){ui->statuslabel->setText(err.text());}else{ui->statuslabel->setText(tr("連接數據庫成功!")); // accept();}} }main.cpp
#include "dialog.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Dialog w;w.show();return a.exec(); }參考資料
1 https://www.cnblogs.com/yuweifeng/p/9403696.html
轉載于:https://www.cnblogs.com/Manual-Linux/p/9813538.html
總結
- 上一篇: java项目性能测试过程记录
- 下一篇: wgrib读grib数据