42.QT-QSqlQuery類操做SQLite數據庫(建立、查詢、刪除、修改)詳解

Qt 提供了 QtSql 模塊來提供平臺獨立的基於 SQL 的數據庫操做。這裏咱們所說的「平臺
獨立」,既包括操做系統平臺,也包括各個數據庫平臺,Qt支持如下幾種數據庫:sql

 

  • QT自帶SQLITE數據庫,不須要再安裝
  • QTDS在Qt4.7起已經被移除

 

1.QtSql數據庫

要使用QtSql 模塊的話,須要在.pro文件中添加這麼一句:函數

QT += sql 

 

2.QSqlDatabase工具

QSqlDatabase類提供了一個接口,用於經過鏈接訪問數據。QSqlDatabase的一個實例表示鏈接。該鏈接經過受支持的數據庫驅動程序之一提供對數據庫的訪問,該驅動程序派生自QSqlDriver。spa

2.1 建立一個數據庫示例以下操作系統

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("scooters.dat");     //若是本目錄下沒有該文件,則會在本目錄下生成,不然鏈接該文件
 if (!db.open()) {                     
        QMessageBox::warning(0, QObject::tr("Database Error"),
                             db.lastError().text());
        return false;
 }

編譯運行後,能夠看到已經建立了該文件:3d

 

建立成功後,該文件默認爲空的,而後就可使用QSqlQuery類來操做該數據庫, QSqlQuery類使用的是SQL語句,若是隻須要使用高層次的數據
庫接口(不關心 SQL 語法),咱們能夠選擇 QSqlTableModel 和
QSqlRelationalTableModel(在後續章節介紹)。本章咱們介紹 QSqlQuery 類,來如何使用SQL語法.code

 

3.QSqlQuery類介紹blog

經過exec()成員函數來執行DML(數據操做語言)語句,如SELECT、INSERT、UPDATE和DELETE,以及DDL(數據定義語言)語句等.接口

好比:

QSqlQuery query;
query.exec("DROP TABLE students");    //刪除名爲students的表

4.接下來,咱們講講如何導入數據

建立表:

query.exec("CREATE TABLE students ("
                   "id INTEGER PRIMARY KEY AUTOINCREMENT, "
                   "name VARCHAR(40) NOT NULL, "
                   " score INTEGER NOT NULL, "
                   "class VARCHAR(40) NOT NULL)");
                //建立一個students表,標題分別爲id、name、score、class

" PRIMARY KEY AUTOINCREMENT,":表示該列爲整數遞增,若是爲空時則自動填入1,而後在下面的每一行都會自動+1, PRIMARY KEY則表示該列做爲列表的主鍵,經過它能夠輕易地獲取某一行數據

" INTEGER ":表示該列爲帶符號的整數

" VARCHAR(40) ":表示該列爲可變長字符串,默認只能存儲英文和數字或者utf-8,最多存儲40個字節.

"NOT NULL ":表示該列的內容不爲空

 

導入數據:

query.exec("INSERT INTO students (name, score,class) "
               "VALUES ('小張', 85, '初2-1班')");  
              //向students表裏的(name, score,class)標題下插入一項數據'小張', 85, '初2-1班'

添加後以下圖所示:

 

 

 

5.批量導入庫

若是咱們有大串數據須要導入時,也可使用prepare()來綁值,而後再經過bindValue()向綁值加入數據

示例代碼以下所示:

QStringList names;
names<<"小A"<<"小B"<<"小C"<<"小D"<<"小E"<<"小F"<<"小G"
           <<"小H"<<"小I"<<"小G"<<"小K"<<"小L"<<"小M"<<"小N";

QStringList clases;
clases<<"初1-1班"<<"初1-2班"<<"初1-3班"<<"初2-1班"
         <<"初2-2班"<<"初2-3班"<<"初3-1班"<<"初3-2班"<<"初3-3班";

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("students.dat");     //在本目錄下生成
QSqlQuery query;
query.exec("DROP TABLE students");        //先清空一下表
query.exec("CREATE TABLE students ("
                   "id INTEGER PRIMARY KEY AUTOINCREMENT, "
                   "name VARCHAR(40) NOT NULL, "
                   " score INTEGER NOT NULL, "
                   "class VARCHAR(40) NOT NULL)");
                //建立一個students表

    query.prepare("INSERT INTO students (name, score,class) "
                  "VALUES (:name, :score, :class)");
                    //爲每一列標題添加綁定值

    foreach (QString name, names)       //從names表裏獲取每一個名字
    {
        query.bindValue(":name", name);                      //向綁定值里加入名字
        query.bindValue(":score", (qrand() % 101));      //成績
        query.bindValue(":class", clases[qrand()%clases.length()] );    //班級
        query.exec();               //加入庫中
     }

運行後,經過SQLite工具打開students.dat,以下圖所示:

 

 

6.查詢表內容

咱們對上圖生成的students.dat文件進行查詢內容時,則須要使用WHERE 關鍵字實現.

示例-查詢成績值爲60~80之間的學生:

    query.exec("SELECT * FROM students WHERE score >= 60 AND score <= 80;");
    while(query.next())
    {
        QString id = query.value(0).toString();
        QString name = query.value(1).toString();
        QString score = query.value(2).toString();
        QString classs = query.value(3).toString();

        qDebug()<<id<<name<<score<<classs;
    }

運行打印:

 

固然還有其它語句,好比:

"SELECT * FROM students WHERE score >= 80 OR class == '初3-3班';"
       //判斷成績大於等於80,或者班級爲初3-3班的

打印以下圖所示:

 

 "SELECT * FROM students WHERE class GLOB '*3-3*';"
            // GLOB表示通配符,匹配班級帶有"3-3"的名字

打印以下圖所示:

 

 

PS:若是想查詢全部內容,則改成 query.exec("SELECT * FROM students ");

 

7.刪表內容

刪表內容有3個語句:

  • DROP:          用來刪除整表,而且連表結構也會刪除,刪除後則只能使用CREATE TABLE來從新建立表
  • TRUNCATE:   在SQLite中沒有該語句,在MySQL中有該語句,用來清楚表內數據,可是表結構不會刪除.
  • DELETE:      刪除部分記錄,而且表結構不會刪除,刪除的速度比上面兩個語句慢,能夠配合WHERE來刪除指定的某行

示例1

query.exec("DELETE FROM students");           //刪除students表裏全部內容

刪除後以下圖所示:

 

示例2-刪除id=3的一行

query.exec("DELETE FROM students WHERE  id = 3");

刪除前:

 

刪除後:

 

 

8.改表內容

改表內容通常用下面兩個語句:

  • UPDATE :      用來修改表中內容,能夠經過WHERE語句來指定修改
  • ALTER  TABLE:  用來重命名錶,或者在已有的表中添加新的一列

8.1 ALTER 示例

示例1

query.exec("ALTER TABLE students RENAME TO new_students");      //將students重命名爲new_students

運行後以下圖所示:

 

 

 示例2

query.exec("ALTER TABLE  new_students ADD COLUMN 結果 VARCHAR(10)");
//向 new_students表裏添加新的一列,標題爲結果,內容格式爲VARCHAR

運行後以下圖所示:

 

 

8.2 UPDATE 示例

示例1-不使用WHERE,直接修改某列

query.exec("UPDATE  new_students  SET score = 100 , name = '小A'");       
                  //修改score和name所在的列內容

修改後以下圖所示:

 

 

示例2-使用WHERE,判斷小於60的設爲不合格,不然設爲合格

query.exec("UPDATE  new_students  SET 結果='不合格'  WHERE  score<60 ");
query.exec("UPDATE  new_students  SET 結果='合格'  WHERE  score>=60 ");

修改前以下圖所示:

 

修改後:

 

相關文章
相關標籤/搜索