1. 程式人生 > >Qt操作SQLite資料庫

Qt操作SQLite資料庫

 資料庫連線由任意字串標識。在沒有指定連線的情況下,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() << "排序失敗!\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();
}