Linux平台QT資料庫編程(來自網路)

來源:互聯網
上載者:User

標籤:使用   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平台下的那下介面麻煩。

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.