Qt操作SQLite資料庫
阿新 • • 發佈:2018-11-10
資料庫連線由任意字串標識。在沒有指定連線的情況下,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();
}