標籤:使用 os io strong 檔案 資料 for ar
Linux平台QT資料庫編程
在linux平台使用qt來編寫GUI程式,在進行資料庫編程的時候,有兩種選擇方式,分別是:基於linux平台的資料庫介面函數編程,另一種是使用qt內建的有關資料庫類。那在這裡我分別來講一下這兩種方式的實現。
一、使用linux平台的資料庫介面編程:
在這裡我使用的是一款免費的資料庫sqlite,從網路上下一個sqlite-3.0.8.tar.gz源碼包,然後進行安裝,安裝好後就可以使用它提供的函數介面。接下來我們用安裝好的sqlite提供的函數介面,在QT中使用的,程式碼片段樣本如下:
這是一個槽函數,在這個槽函數實現了對資料庫的操作,使用的是剛才自已安裝好的sqlite資料庫提供的API函數。
void Qt1::open_data()
{
int ret;
char *zErrMsg;
//開啟資料庫,如果這個資料庫檔案不存在,就建立它
ret = sqlite3_open("student.db",&db);
if(ret)
{
fprintf(stderr,"cannot open database:%s\n",sqlite3_errmsg(db));
sqlite3_close(db);
exit(-1);
}
else
{
printf("you are right\n");
}
//SQL語句
char *sql = (char *)"CREATE TABLE StudentData(\
ID INTEGER PRIMARY KEY,\
SID TNTEGER,\
Name VARCHAR(20),\
Score INTEGER\
);";
//通過C介面來執行上面的一個SQL語句,建立一個表
sqlite3_exec(db,sql,0,0,&zErrMsg);
}
這裡只是給了一個簡單的執行個體,通過那些SQL語句,然後搭配上SQLITE提供的操作介面函數,我們就可以對資料庫進行增、刪、改、查等這一系列的操作。當然在編譯的時候要注意的是一定要去串連這樣的一個sqlite資料庫的動態庫,否則是編譯不過的。
二、使用qt內建的資料庫編程的類:
在qt中,提供了一個QtSql這樣的一個模組,QtSql這個模組提供了與平台以及資料庫種類無關的訪問SQL資料庫的介面,這個介面由利用Qt的模型/視圖結構將資料庫與使用者介面整合的一套類來支援。QSqlDatabase對象表徵了資料庫的關聯,Qt使用驅動程式與各種資料庫的應用編程介面進行通訊。QT支援多種資料庫,但大部分資料庫是收費的,QT提供內建的資料庫,那就是SQLITE。
那麼如下我們將會使用QT提供的操作介面,來對資料庫的操作,程式碼範例如下:
標頭檔data.h
#ifndef _DATA_
#define _DATA_
#include <QDialog>
#include <QString>
#include <QSqlQuery>
#include <QSqlDatabase>
#include "ui_data.h"
class Data: public QDialog, public Ui_Data
{
Q_OBJECT
public:
Data(QWidget *parent = 0);
void creatData();
public slots:
void dataInsert();
void dataSelete();
private:
QSqlDatabase db; //內建一個QSqlDatabase對象,通過它來和資料庫進行關聯
QSqlQuery *query; // QSqlQuery提供了很多可以用來處理資料來源的介面
};
#endif
/****************************************************************/
實現檔案data.cpp
/****************************************************************/
#include <QDebug>
#include <QSqlError>
#include <QStringList>
#include <QTableWidgetItem>
#include "data.h"
Data::Data(QWidget *parent):QDialog(parent)
{
setupUi(this);
creatData(); //建立資料庫檔案
connect(pbInsert, SIGNAL(clicked()), this, SLOT(dataInsert()));
connect(pbSelete, SIGNAL(clicked()), this, SLOT(dataSelete()));
connect(pbQuit, SIGNAL(clicked()), this, SLOT(close()));
}
void Data::creatData()
{
//建立一個QSqlDatabase對象,addDatabase函數第一個參數指定了Qt
//必須使用哪一個資料庫驅動程式來訪問這個資料庫
db = QSqlDatabase::addDatabase("QSQLITE");
db.setHostName("linux");
//設定資料庫檔案的名字
db.setDatabaseName("database");
//設定使用者名稱
db.setUserName("steve");
//設定密碼
db.setPassword("steve");
//開啟資料庫檔案
bool ok = db.open("steve", "steve");
if(ok)
{
qDebug()<<"you are right";
}
//指定db為query的父類
query = new QSqlQuery(db);
//建立一個表
query->exec("CREATE TABLE data (\
ID INTEGER PRIMARY KEY AUTOINCREMENT,\
name VARCHAR(6) NOT NULL,\
score VARCHAR(20) NOT NULL);");
query->clear();
}
void Data::dataInsert()
{
QString name = leName->text();
QString score = leScore->text();
qDebug()<<name<<":"<<score;
/* Prepares the SQL query query for execution. Returns true if the query is prepared successfully; otherwise returns false.*/
//使用prepare()來指定一個包含預留位置的查詢,
//然後賦值綁定想插入的資料
query->prepare("INSERT INTO data(name, score) VALUES (:name, :score)");
query->bindValue(":name", name.toLocal8Bit().data());
query->bindValue(":score", score.toLocal8Bit().data());
query->exec(); //執行SQL語句
query->clear();
}
void Data::dataSelete()
{
tableWidget->setRowCount(10);
tableWidget->setColumnCount(2);
tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem("Name"));
tableWidget->setHorizontalHeaderItem(1, new QTableWidgetItem("Score"));
query->exec("SELECT * FROM data");
int i = 1;
int j = 0;
//只要調用next()第一次,就可以把這個QSqlQuery定位到結果集中的第一條記錄,
//隨後再調用next(),每次都會把記錄指標前移一條記錄,直到到達結尾時返回false。
while (query->next())
{
//value(i)把欄位值作為QVariant返回。
QString name = query->value(i++).toString();
tableWidget->setItem(j, i-2, new QTableWidgetItem(name));
QString score = query->value(i).toString();
tableWidget->setItem(j++, i-1, new QTableWidgetItem(score));
i = 1;
}
query->clear();
}
通過以上的代碼,實現的效果如下:
如果想用QtSql模組的話,還必須在pro檔案中加入一條語句:QT += sql
以下是有關Qt對資料庫操作的一些類:
QSqlDatabase QSqlDriver QSqlQuery QSqlError QSqlQueryModel
QSqlTableModel QSqlRelation QSqlRelationalTableModel
總結:
在用Qt做GUI編程時,如果是對資料庫的操作的話,那麼可以使用兩種方法,但是對Qt本身來說,還是使用Qt內建的QtSql模組來操作還是比較好,通過Qt自己的一些類來操作這些資料庫,沒有使用linux平台下的那下介面麻煩。