Qt 提供了 QtSql 模塊來提供平臺獨立的基於 SQL 的數據庫操做。這裏咱們所說的「平臺
獨立」,既包括操做系統平臺,也包括各個數據庫平臺,Qt支持如下幾種數據庫:sql
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個語句:
示例1
query.exec("DELETE FROM students"); //刪除students表裏全部內容
刪除後以下圖所示:
示例2-刪除id=3的一行
query.exec("DELETE FROM students WHERE id = 3");
刪除前:
刪除後:
8.改表內容
改表內容通常用下面兩個語句:
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 ");
修改前以下圖所示:
修改後: