zoukankan      html  css  js  c++  java
  • 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       += sql
    
    
    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
    
    TARGET = CH1301
    TEMPLATE = app
    
    
    SOURCES += main.cpp
            dialog.cpp
    
    HEADERS  += dialog.h
    
    FORMS    += dialog.ui
    
    

    dialog.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_OBJECT
    
    public:
        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_H
    
    

    dialog.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() << "排序失败!
    ";
        }
    
        //删除
        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

  • 相关阅读:
    用 tableExcel导出EXCEL数据
    个人作业——软件评测
    结对第二次作业——某次疫情统计可视化的实现
    软工实践寒假作业(1/2)
    java注解和反射
    共享密钥
    鲁棒性验证-第五小组
    维数约减报告--第五小组
    网络1911、1912 D&S第1次作业--线性表批改总结
    网络1911、1912 C语言第4次作业--函数批改总结
  • 原文地址:https://www.cnblogs.com/Manual-Linux/p/9813538.html
Copyright © 2011-2022 走看看