QT數(shù)據(jù)庫操作_第1頁
QT數(shù)據(jù)庫操作_第2頁
QT數(shù)據(jù)庫操作_第3頁
QT數(shù)據(jù)庫操作_第4頁
QT數(shù)據(jù)庫操作_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、二十一、Qt數(shù)據(jù)庫(一)簡介(原創(chuàng))2010-03-02 12:03聲明:本文原創(chuàng)于 yafeilinux的百度博客,轉(zhuǎn)載請注明出處。從今天開始我們學(xué)習(xí)Qt數(shù)據(jù)庫編程的內(nèi)容。先說明:我們以后使用現(xiàn)在最新的基于Qt 4.6.2的Qt Creator 1.3.1 Windows版本,該版本是2010年2月17日發(fā)布的。數(shù)據(jù)庫幾乎是每個較大的軟件所必須應(yīng)用的,而在 Qt中也使用QtSql模塊實現(xiàn) 了對數(shù)據(jù)庫的完美支持。我們在 Qt Creator的幫助中查找QtSql Module,其內(nèi) 容如下圖:可以看到這個模塊是一組類的集合,使用這個模塊我們需要加入頭文件#i nclude <QtSql&

2、gt; ,而在工程文件中需要加入一行代碼:QT += sql這里每個類的作用在后面都有簡單的介紹,你也可以進入其中查看其詳細內(nèi)容。下面我們先簡單的說一下 QSqlDatabase類和QSqlQuery類。QSqlDatabase類實現(xiàn)了數(shù)據(jù)庫連接的操作,現(xiàn)在Qt支持的數(shù)據(jù)庫類型有如下幾 種:Driver TypeGOB:IBM 062obascSortaM換心陸OrWCWfSQLMySQL OrMrooaOracle Cart wteflace OnvefoooecOOOC OtMrMCfOXA SOU Servtr)QPSQLPostOteSOL DrtwwqesquteSQUte werM

3、on 3 orQSCMJTE2SQUtevcnton 2QTDSSyowe AdaptM Server而現(xiàn)在我們使用的免費的Qt只提供了 SQLite和ODB數(shù)據(jù)庫的驅(qū)動(我們可以在 Qt Creator安裝目錄下的qt'plugins'sqldrivers文件夾下查看),而其他數(shù)據(jù)庫的驅(qū)動需要我們自己添加。SQLite是一個小巧的嵌入式數(shù)據(jù)庫,關(guān)于它的介 紹你可以自己在網(wǎng)上查找。QSqlQuery類用來執(zhí)行SQL語句。(關(guān)于SQL語句:在我的教程中只會出現(xiàn)很簡 單的SQL語句,你沒有相關(guān)知識也可以看懂,但是如果想進行深入學(xué)習(xí),就需要 自己學(xué)習(xí)相關(guān)知識了。) 下面我們就先利用這

4、兩個類來實現(xiàn)最簡單的數(shù)據(jù)庫程序,其他的類我們會在以后 的教程中逐個學(xué)習(xí)到。1.新建Qt控制臺工程2.選擇上QtSql模塊,這樣就會自動往工程文件中添加QT += sql這行代碼了3.修改ma in .cpp中的內(nèi)容如下。#include vQtCore/QCoreApplication>#i nclude <QtSql>int main (i nt argc, char *argv)QCoreApplicatio n a(argc, argv);QSqlDatabase db = QSqlDatabase:addDatabase("QSQLITE"); /

5、 添加數(shù)據(jù) 庫驅(qū)動db.setDatabaseName(":memory:");/ 數(shù)據(jù)庫連接命名if(!db.open()/ 打開數(shù)據(jù)庫return false;QSqlQuery query; /以下執(zhí)行相關(guān)QSL語句query.exec("create table student(idint primary key,name varchar)");/新建student表,id設(shè)置為主鍵,還有一個 name項query.exec("i nsert into stude nt values(1,'xiaoga ng')&quo

6、t;);query.exec("insert into student values(2,'xiaoming')");query.exec("i nsert into stude nt values(3,'xiaoh on g')");/向表中插入3條記錄query.exec("select id, name from stude nt where id >= 2");/查找表中id >=2 的記錄的id項和name項的值while(query. next()/query. next()指向

7、查找到的第一條記錄,然后每次后移一條記錄int ele0 = query.value(0).tol nt();/query.value(O) 是id的值,將其轉(zhuǎn)換為int型QStri ng ele1 =query.value(1).toStri ng();qDebug() << ele0 <<ele1 ;/ 輸出兩個值return a.exec();我們使用了 SQLite數(shù)據(jù)庫,連接名為“:memory:”表示這是建立在內(nèi)存中的數(shù) 據(jù)庫,也就是說該數(shù)據(jù)庫只在程序運行期間有效。如果需要保存該數(shù)據(jù)庫文件, 我們可以將它更改為實際的文件路徑。4.最終效果如下* 4RN*A5

8、.我們可以將主函數(shù)更改如下 int main (i nt argc, char *argv)QCoreApplicatio n a(argc, argv);qDebug() << "Available drivers:"QStri ngList drivers = QSqlDatabase:drivers(); foreach(QStri ng driver, drivers) qDebug() << "t" << driver;return a.exec();這樣運行程序就可以顯示現(xiàn)在所有能用的數(shù)據(jù)庫驅(qū)動了可以看到現(xiàn)

9、在可用的數(shù)據(jù)庫驅(qū)動只有三個。二十二、Qt數(shù)據(jù)庫(二)添加MySQI數(shù)據(jù)庫驅(qū)動插件(原創(chuàng))2010-03-08 18:06聲明:本文原創(chuàng)于 yafeilinux 的百度博客,轉(zhuǎn)載請注明出處。在上一節(jié)的末尾我們已經(jīng)看到,現(xiàn)在可用的數(shù)據(jù)庫驅(qū)動只有3種,那么怎樣使用其他的數(shù)據(jù)庫呢?在 Qt中,我們需要自己編譯其他數(shù)據(jù)庫驅(qū)動的代碼,讓它 們以插件的形式來使用。下面我們就以現(xiàn)在比較流行的MySQ數(shù)據(jù)庫為例,說明一下怎樣在Qt Creator中添加數(shù)據(jù)庫驅(qū)動插件。在講述之前,我們先看一下Qt Creator中數(shù)據(jù)庫的插件到底放在哪里我們進入Qt Creator的安裝目錄,然后進入相對應(yīng)的文件夾下,比方我這里

10、是D:Qt2010.02.1qtplugi ns'sqldrivers在這里我們可以看見幾個文件,如下圖:根據(jù)名字中的關(guān)鍵字,我們可以判斷出這就是ODB(數(shù)據(jù)庫和SQLite數(shù)據(jù)庫的驅(qū) 動插件。下面我們編譯好 MySQI數(shù)據(jù)庫驅(qū)動后,也會在這里出現(xiàn)相對應(yīng)的文件。首先:我們查看怎樣安裝數(shù)據(jù)庫插件。我們打開Qt Creator,在幫助中搜索 SQL Database Drivers關(guān)鍵字。這里列出 了編譯Qt支持的所有數(shù)據(jù)庫的驅(qū)動的方法。我們下拉到在windows上編譯QMYSC數(shù)據(jù)庫插件的部分,其內(nèi)容如下:這里詳細介紹了整個編譯的過程,其可以分為以下幾步:第一,下載MySQ的安裝程序,在

11、安裝時選擇定制安裝,這時選中安裝Libs和Include文件。安裝位置可以是C:MySQL 0注意:安裝位置不建議改動,因為下面進行編譯的命令中使用了安裝路徑,如果改動,那么下面也要進行相應(yīng)改動。第二,進行編譯。我們按照實際情況輸入的命令如下。cd %QTDIR%srcplug in ssqldriversmysql qmake "INCLUDEPATH+=C:MySQLi nclude""LIBS+=C:MySQLliboptlibmysql.lib" min gw32-make注意:在上面的命令中qmake之后如果加上“ -o Ma

12、kefile ”選項,那么這個插 件只能在以release模式編譯程序時才能使用,所以我們上面沒有加這個選項。然后:我們按照上面的過程進行相應(yīng)操作。1.我們先下載MySQ的安裝文件。我們可以到MySQL的官方主頁 進行下載最新的 MySQL的windows版本,現(xiàn)在具體的下載頁面地址為: nloads/mirror.php?id=383405#mirrors我們不進行注冊,直接點擊其下面的No tha nks, just take me to the dow nl oads!Asia下的最后一個,就是,其中的win32表明是3240M左右。可以在其中選擇一個鏡像網(wǎng)點進行下載,我使用的是 臺灣的

13、鏡像網(wǎng)點下載的。下載到的文件名為:mysql-esse ntial-5.1.44-wi n32位的windows系統(tǒng),這一點一定要注意。文件大小為當然你也可以到中文網(wǎng)站上進行下載:http:/www.mysql.c n/,隨便下一個wi ndows的版本就行。2. 安裝軟件。我們選擇定制安裝Custom。然后選中安裝Include文件和Lib文件我們將安裝路徑更改為:C:MySQL最終的界面如下安裝完成后,我們不進行任何操作,所以將兩個選項都取消3.進行編譯我們在桌面上開始菜單中找到 Qt Creator的菜單,然后打開Qt CommanPrompt| 宿 Tools>亡;Qi Com(

14、ni&n.d Frcm-pt、I Qt Cr4«itwII f j Qt1 創(chuàng) qt. noki a., con1 fjlQt SBK 20W.02, 1后按回車,然后輸入第一條命令 cd %QTDIR%srcpluginssqldriversmysql 運行效果如下。然后輸入第二條命令:qmake "INCLUDEPATH+=C:MySQLi nclude""LIBS+=C:MySQLliboptlibmysql.lib" 按回車后運行效果如下:最后輸入:mingw32-make,按下回車后經(jīng)過幾秒的編譯,最終效果如

15、下:整個編譯過程中都沒有出現(xiàn)錯誤提示,可以肯定插件已經(jīng)編譯完成了4.我們再次進入Qt Creator安裝目錄下存放數(shù)據(jù)庫驅(qū)動插件的文件夾我這里是 D:Qt2010.02.1qtplugins'sqldrivers其內(nèi)容如下:可以看到已經(jīng)有了和MySQL!關(guān)的文件了。最后:我們編寫程序測試插件。1. 我們將上一次的主函數(shù)更改如下。int main (i nt argc, char *argv)QCoreApplicatio n a(argc, argv);QSqlDatabase db = QSqlDatabase:addDatabase("QMYSQL"); / 添

16、加數(shù)據(jù) 庫驅(qū)動return a.exec();運行程序,效果如下這里提示:QSqlDatabase: QMYSQL driver not loaded 。2.這時我們需要將C:MySQLbin目錄下的libmySQL.dll文件復(fù)制到我們 Qt Creator安裝目錄下的qtbin 目錄中。如下圖:3. 這時再運行程序,就沒有提示了4. 我們再將主函數(shù)更改一下,測試這時可用的數(shù)據(jù)庫驅(qū)動。int main (i nt argc, char *argv)QCoreApplicatio n a(argc, argv);qDebug() << "Available drivers

17、:"QStri ngList drivers = QSqlDatabase:drivers(); foreach(QStri ng driver, drivers) qDebug() << "t" << driver;return a.exec();運行效果如下:可以看到,現(xiàn)在已經(jīng)有了 MySQ的數(shù)據(jù)庫驅(qū)動了我們這里只介紹了 MySQI驅(qū)動插件在windows下的編譯方法,其他數(shù)據(jù)庫和其他 平臺的編譯方法可以按照幫助中的說明進行,我們不再介紹。其實Qt不僅可以編譯現(xiàn)成的數(shù)據(jù)庫驅(qū)動插件,我們也可以編寫自己的數(shù)據(jù)庫驅(qū)動插件, 當然這是 一件相當

18、復(fù)雜的事情,我們這里也就不再進行介紹。關(guān)于MySQ的使用,我們的教程里現(xiàn)在不再涉及,在這里有 MySQL勺中文參考手冊,你可以進行參考。二十三、Qt數(shù)據(jù)庫(三)利用QSqlQuery類執(zhí)行SQL語句(一)(原創(chuàng))2010-03-11 23:22聲明:本文原創(chuàng)于 yafeilinux 的百度博客,轉(zhuǎn)載請注明出處。SQL即結(jié)構(gòu)化查詢語言,是關(guān)系數(shù)據(jù)庫的標準語言。前面已經(jīng)提到,在Qt中利用QSqlQuery類實現(xiàn)了執(zhí)行SQL語句。需要說明,我們這里只是 Qt教程,而非 專業(yè)的數(shù)據(jù)庫教程,所以我們不會對數(shù)據(jù)庫中的一些知識進行深入講解,下面 只是對最常用的幾個知識點進行講解。我們下面先建立一個工程,然后

19、講解四個知識點,分別是:query.exec("select * from zb_tb where zd_bs like '"+ aValue + "%' ord er by zf_bfb desc");,操作SQL語句返回的結(jié)果集,在SQL語句中使用變量 三,批處理操作 四,事務(wù)操作 我們新建Qt4 Gui Application 工程,我這里工程名為query,然后選中QtSql 模塊,Base class選QWidget。工程建好后,添加 C+ Header File ,命名為 conn ecti on.h ,更改其內(nèi)容如下:#if

20、ndef CONNECTION #defi ne CONNECTION_H #in clude <QMessageBox> #i nclude <QSqlDatabase> #i nclude <QSqlQuery> static bool createC onnection()QSqlDatabase db = QSqlDatabase:addDatabase("QSQLITE"); db.setDatabaseName(":memory:");if (!db.ope n() QMessageBox:critical

21、(0, qApp->tr("Ca nnot ope n database"), qApp->tr("U nable to establish a database conn ecti on." ),QMessageBox:Ca ncel);return false;QSqlQuery query;query.exec("create table stude nt (id int primary key,""n ame varchar(20)");query.exec("i nsert into

22、 stude nt values(0, 'first')");query.exec("i nsert into stude nt values(1, 'sec on d')"); query.exec("i nsert into stude nt values(2, 'third')");query.exec("i nsert into stude nt values(3, 'fourth')"); query.exec("i nsert into s

23、tude nt values(4, 'fifth')");return true;#en dif / CONNECTION_H然后更改 ma in .cpp的內(nèi)容如下: #include vQtGui/QApplication>#include "widget.h"#in elude "conn ectio n.h" int main (i nt argc, char *argv) QApplicati on a(argc, argv);if (!createC onn ecti on() return 1;Widget

24、w;w.show();return a.exec();可以看到,我們是在主函數(shù)中打開數(shù)據(jù)庫的,而數(shù)據(jù)庫連接用一個函數(shù)完成,并單獨放在一個文件中,這樣的做法使得主函數(shù)很簡潔。我們今后使用數(shù)據(jù)庫時均 使用這種方法。我們打開數(shù)據(jù)庫連接后,新建了一個學(xué)生表,并在其中插入了幾 條記錄。idname0first1second2third3fourth4fifth表中的一行就叫做一條記錄,一列是一個屬性。這個表共有5條記錄,id和name 兩個屬性。程序中的“ id int primary key ”表明id屬性是主鍵,也就是說以 后添加記錄時,必須有id項。下面我們打開widget.ui文件,在設(shè)計器中向

25、界面上添加一個Push Butt on ,和一個Spin Box。將按鈕的文本改為“查詢”,然后進入其單擊事件槽函數(shù), 更改如下。void Widget: on _pushButt on _clicked() IQSqlQuery query;query.exec("select * from stude nt");while(query. next()qDebug() << query.value(0).to In t() <<query.value(1).toStri ng();我們在widget.cpp中添加頭文件:#i nclude <

26、QSqlQuery>#i nclude <QtDebug>然后運行程序,單擊“查詢”按鈕,效果如下:r* r 口yi k 1: J. 細 f 'M bL£14 -fbftl-可以看到在輸出窗口,表中的所有內(nèi)容都輸出出來了。這表明我們的數(shù)據(jù)庫連接 已經(jīng)成功建立了。,操作SQL語句返回的結(jié)果集在上面的程序中,我們使用 query.exec("select * from stude nt");來查詢出表中所有的內(nèi)容。其中的 SQL語句“ select * from student ”中“ *”號表明查 詢表中記錄的所有屬性。而當query.ex

27、ec("select * from stude nt");這條語句執(zhí)行完后,我們便獲得了相應(yīng)的執(zhí)行結(jié)果,因為獲得的結(jié)果可能不止一條記錄, 所以我們稱之為結(jié)果集。結(jié)果集其實就是查詢到的所有記錄的集合,而在QSqlQuery類中提供了多個函數(shù) 來操作這個集合,需要注意這個集合中的記錄是從 0開始編號的。最常用的有:seek(int n): query 指向結(jié)果集的第 n條記錄first():query指向結(jié)果集的第一條記錄。last():query指向結(jié)果集的最后一條記錄。next():query指向下一條記錄,每執(zhí)行一次該函數(shù),便指向相鄰的下一條記錄。previous。: q

28、uery指向上一條記錄,每執(zhí)行一次該函數(shù),便指向相鄰的上條記錄record():獲得現(xiàn)在指向的記錄value(int n):獲得屬性的值。其中n表示你查詢的第n個屬性,比方上面我們使用“ select * from student ”就相當于“ select id, namefrom student ”, 那么value(O)返回id屬性的值,value(1)返回name屬性的值。該函數(shù)返回 QVariant類型的數(shù)據(jù),關(guān)于該類型與其他類型的對應(yīng)關(guān)系,可以在幫助中查看 QVariant。at():獲得現(xiàn)在query指向的記錄在結(jié)果集中的編號。需要說明,當剛執(zhí)行完 query.exec(&quo

29、t;select * from stude nt");這行代碼時,query是指向結(jié)果集以外的,我們可以利用query.next(),當?shù)谝淮螆?zhí)行這句代 碼時,query便指向了結(jié)果集的第一條記錄。當然我們也可以利用 seek(O)函數(shù) 或者first() 函數(shù)使query指向結(jié)果集的第一條記錄。但是為了節(jié)省內(nèi)存開銷, 推薦的方法是,在 query.exec("select * from student");這行代碼前加上query.setForwardOnly(true);這條代碼,此后只能使用 next()和 seek()函數(shù)。F面將“查詢”按鈕的槽函數(shù)更改如

30、下: void Widget: on _pushButt on _clicked() 一 一QSqlQuery query;query.exec("select * from stude nt");qDebug() << "exec next():"if(query .n ext()/ 開始就先執(zhí)行一次next()函數(shù),那么query指向結(jié)果集的第一條記錄int rowNum = query.at();/獲取query所指向的記錄在結(jié)果集中的編號int columnNum = query.record().count();/獲取每條記錄中屬性

31、(即列)的個數(shù)int fieldNo = query.record().i ndexOf(” name");/獲取"n ame"屬性所在列的編號,列從左向右編號,最左邊的編號為0int id = query.value(O).toInt();/獲取id屬性的值,并轉(zhuǎn)換為int型QStri ng n ame = query.value(fieldNo).toStri ng();/獲取name屬性的值qDebug() << "rowNum is : " << rowNum / 將結(jié)果輸出<< "id i

32、s : " << id<< "n ame is : " << n ame<< "colu mnNum is : " << colu mnNum;qDebug() << "exec seek(2):"if(query.seek(2)/定位到結(jié)果集中編號為2的記錄,即第三條記錄,因為第一條記錄的編號為0qDebug() << "rowNum is :" << query.at()<< "id

33、is : " << query.value(0).tol nt()<< "n ame is : " << query.value(1).toStri ng();qDebug() << "exec last():"if(query .l ast()/定位到結(jié)果集中最后一條記錄qDebug() << "rowNum is : " << query.at()<< "id is : " << query.value(0

34、).toI nt()<< "n ame is : " << query.value(1).toStri ng();然后在widget.cpp文件中添加頭文件。#in clude <QSqlRecord>運行程序,結(jié)果如下:二十四、Qt數(shù)據(jù)庫(四)利用QSqlQuery類執(zhí)行SQL語句(二)(原創(chuàng)) 2010-03-12 21:51轉(zhuǎn)載請注聲明:本文原創(chuàng)于 yafeilinux的百度博客,明出處。接著上一篇教程。,在SQL語句中使用變量 我們先看下面的一個例子,將“查詢”按鈕的槽函數(shù)更改如下:void Widget: on _pushBut

35、t on _clicked() QSqlQuery query; query.prepare("i nsert into stude nt (id, n ame)" "values (:id, :n ame)");query.b in dValue(O, 5);query.b in dValue(1, "sixth"); query.exec();/下面輸出最后一條記錄query.exec("select * from stude nt"); query .l ast();int id = query.value(

36、0).toInt();QStri ng n ame = query.value(1).toStri ng(); qDebug() << id << n ame;運行效果如下:可以看到,在student表的最后又添加了一條記錄。在上面的程序中,我們先使用了prepare。函數(shù),在其中利用了 “:id ”和“:name”來代替具體的數(shù)據(jù),而后又利用bindValue()函數(shù)給id和name兩個屬性賦值,這稱為綁定操作。其中編號 0和1分別代表 “:id ”和“:n ame”,就是說按照prepare。函數(shù)中出現(xiàn)的屬性從左到右編號,最左邊是0。這里的“ :id ”和“:nam

37、e”,叫做占位符,這是 ODB(數(shù)據(jù)庫的表示方法,還有一種 Oracle 的表示方法就是全部用“? ”號。如下:query.prepare("i nsert into stude nt (id, n ame)""values (?, ?)");query.b in dValue(0, 5);query.b in dValue(1, "sixth");query.exec();我們也可以利用addBindValue()函數(shù),這樣就可以省去編號,它是按順序給屬性賦值的, 如下:query.prepare("i nsert int

38、o stude nt (id, n ame)""values (?, ?)");query.addB in dValue(5);query.addBi ndValue("sixth"); query.exec();當用ODBC勺表示方法時,我們也可以將編號用實際的占位符代替,如下:query.prepare("i nsert into stude nt (id, n ame)""values (:id, :n ame)");query.bi ndValue(":id", 5);quer

39、y.bi ndValue(": name", "sixth");query.exec();以上各種形式的表示方式效果是一樣的。特別注意,在最后一定要執(zhí)行exec()函數(shù),所做的操作才能被真正執(zhí)行。下面我們就可以利用綁定操作在SQL語句中使用變量了。void Widget: on _pushButt on _clicked()QSqlQuery query;query.prepare("select n ame from stude nt where id = ?");int id = ui->spinBox->value(

40、);/ 從界面獲取 id 的值query.addBindValue(id); / 將 id 值進行綁定query.exec();query.next();/指向第一條記錄qDebug() << query.value(0).toString();運行程序,效果如下:f Winr'Viwr1 M«|! wti我們改變spin Box的數(shù)值大小,然后按下“查詢”按鈕,可以看到對應(yīng)的結(jié)果就出來了三,批處理操作 當要進行多條記錄的操作時,我們就可以利用綁定進行批處理??聪旅娴睦印oid Widget: on _pushButt on _clicked() 一 一QSq

41、lQuery q;q.prepare("i nsert into stude nt values (?, ?)");QVaria ntList in ts;ints << 10 << 11 << 12 << 13;q.addB in dValue(i nts);QVaria ntList n ames;names << "xiaoming" << "xiaoliang"<< "xiaogang" << QVariant(

42、QVariant:String);/最后一個是空字符串,應(yīng)與前面的格式相同q.addB in dValue( names);if (!q.execBatch()/進行批處理,如果出錯就輸出錯誤qDebug() << q.l astError();/ 下面輸出整張表QSqlQuery query;query.exec("select * from stude nt");while(query. next()int id = query.value(0).tolnt();QStri ng n ame = query.value(1).toStri ng(); qDe

43、bug() << id << n ame;然后在widget.cpp文件中添加頭文件 #include <QSqlError>我們在程序中利用列表存儲了同一屬性的多個值,然后進行了值綁定。最后執(zhí)行execBatch()函數(shù)進行批處理。注意程序中利用 QVariant(QVariant:String)來輸入空值NULL因為前面都是QString類型的,所以這里要使用 QVariant:String 使格式一致化。運行效果如下:Application OuitputqueryStarting E:t2010y. axe .0I "丸“訛"3

44、fourth*4 "fifth*10 wxi aoming*II aoli12d a四,事務(wù)操作 事務(wù)是數(shù)據(jù)庫的一個重要功能,所謂事務(wù)是用戶定義的一個數(shù)據(jù)庫操作序列, 這些操作要么全做要么全不做,是一個不可分割的工作單位。在Qt中用transaction()開始一個事務(wù)操作,用commit()函數(shù)或rollback。 函數(shù)進行結(jié)束。commit()表示提交,即提交事務(wù)的所有 操作。具體地說就是將事務(wù)中所有對數(shù)據(jù)庫的更新寫回到數(shù)據(jù)庫,事務(wù)正常結(jié)束。rollback。表示回滾,即在事務(wù)運行的過程中發(fā)生了某種故障,事務(wù)不能繼續(xù)進行,系統(tǒng)將事務(wù)中對數(shù)據(jù)庫的所有已完成的操作全部撤銷,回滾到事務(wù)

45、開始時的狀態(tài)。如下面的例子:void Widget: on _pushButt on _clicked() 一 一if(QSqlDatabase:database().driver()->hasFeature(QSqlDriver:Tra nsactio ns)/先判斷該數(shù)據(jù)庫是否支持事務(wù)操作QSqlQuery query;if(QSqlDatabase:database().transaction()/ 啟動事務(wù)操作/下面執(zhí)行各種數(shù)據(jù)庫操作query.exec("i nsert into stude nt values (14, 'hello')")

46、;query.exec("delete from stude nt where id = 1");/if(!QSqlDatabase:database().commit()qDebug() << QSqlDatabase:database ().l astError();/提交if(!QSqlDatabase:database().rollback()qDebug() << QSqlDatabase:database().lastError();/ 回滾/輸出整張表query.exec("select * from stude nt&quo

47、t;);while(query. next()qDebug() << query.value(0).to In t() << query.value(1).toStri ng();然后在widget.cpp文件中添加頭文件 #include <QSqlDriver> 。QSqlDatabase:database() 返回程序前面所生成的連接的QSqlDatabase對象。hasFeature()函數(shù)可以查看一個數(shù)據(jù)庫是否支持事務(wù)。運行結(jié)果如下:Pippli cation Output丁 d. 半 qu旳口Jig E. QtSO 10Vquardebug(ju

48、ety.0 * first"Z * third*3 "four th '414 "hd.1/可以看到結(jié)果是正確的。對SQL語句我們就介紹這么多,其實 Qt中提供了更為簡單的不需要 SQL語句就可以操作數(shù) 據(jù)庫的方法,我們在下一節(jié)講述這些內(nèi)容。二十五、Qt數(shù)據(jù)庫(五)QSqlQueryModel (原創(chuàng))2010-03-22 21:11聲明:本文原創(chuàng)于 yafeilinux的百度博客,轉(zhuǎn)載請注明出處。在上一篇的最后我們說到,Qt中使用了自己的機制來避免使用SQL語句,它為我們提供了更簡單的數(shù)據(jù)庫操作和數(shù)據(jù)顯示模型。它們分別是只讀的QSqlQueryModel

49、,操作單表的QSqlTableModel和以及可以支持外鍵的 QSqlRelationalTableModel 。這次我們先講解 QSqlQueryModel。QSqlQueryModel類為SQL的結(jié)果集提供了一個只讀的數(shù)據(jù)模型,下面我們先利 用這個類進行一個最簡單的操作。我們新建Qt4 Gui Application 工程,我這里工程名為 queryModel,然后選中 QtSql 模塊,Base class 選 QWidget。工程建好后,添加 C+ Header File ,命 名為database.h,更改其內(nèi)容如下:#ifndef DATABASE#defi ne DATABASE

50、_H#i nclude <QSqlDatabase>#i nclude <QSqlQuery>static bool createC onnection()QSqlDatabase db = QSqlDatabase:addDatabase("QSQLITE");db.setDatabaseName("database.db");if(!db.ope n() return false;QSqlQuery query;query.exec("create table student (id int primary key,

51、 namevchar)"); query.exec("i nsert into stude nt values (0,'yafei0')");query.exec("insert into student values (1,'yafei1')");query.exec("insert into student values (2,'yafei2')"); return true;#en dif / DATABASE這里我們使用了 db.setDatabaseName(&quo

52、t;database.db"); ,我們沒有再使用以前 的內(nèi)存數(shù)據(jù)庫,而是使用了真實的文件,這樣后面對數(shù)據(jù)庫進行的操作就能保存 下來了。然后進入main.cpp,將其內(nèi)容更改如下:#include vQtGui/QApplication>#include "widget.h"#in clude "database.h"int main (i nt argc, char *argv)QApplicati on a(argc, argv);if(!createC onn ectio n()return 1;Widget w;w.show();

53、return a.exec();下面我們在widget.ui中添加一個顯示為“查詢”的Push Button,并進入其單擊事件槽函數(shù),更改如下:void Widget: on _pushButt on _clicked()QSqlQueryModel *model = new QSqlQueryModel;model->setQuery("select * from stude nt");model->setHeaderData(O, Qt:Horizo ntal, tr("id");model->setHeaderData(1, Qt

54、:Horizontal, tr("name");QTableView *view = new QTableView;view->setModel(model);view->show();我們新建了 QSqlQueryModel類對象model,并用setQuery()函數(shù)執(zhí)行了 SQL語 句“("select * from student"); ”用來查詢整個 student表的內(nèi)容,可以看到, 該類并沒有完全避免SQL語句。然后我們設(shè)置了表中屬性顯示時的名字。最后我們建立了一個視圖view,并將這個model模型關(guān)聯(lián)到視圖中,這樣數(shù)據(jù)庫中的

55、 數(shù)據(jù)就能在窗口上的表中顯示出來了。我們在widget.cpp中添加頭文件:#i nclude <QSqlQueryModel>#i nclude <QTableView>我們運行程序,并按下“查詢”按鍵,效果如下:我們在工程文件夾下查看數(shù)據(jù)庫文件:13T'F面我們利用這個模型來操作數(shù)據(jù)庫 1.我們在 void Widget:on_pushButton_clicked() 函數(shù)中添加如下代碼:int column = model->columnCount();/ 獲得歹U數(shù)in t row = model->rowCo un t();/ 獲得行數(shù)QS

56、qlRecord record = model->record(1); / 獲得一條記錄QModelIndex index = model->index(1,1);/ 獲得一條記錄的一個屬性的值qDebug() << "colu mn num is:" << colu mn << endl<< "row num is:" << row << endl<<"the sec ond record is:" << record <

57、;< endl<< "the data of in dex(1,1) is:"<< in dex.data();在我們在widget.cpp中添加頭文件:#i nclude <QSqlRecord> #i nclude <QModelI ndex> #in clude <QDebug>此時運行程序,效果如下:2«* aqp 耳 J訃鼻 iMil屯« GKlst祁 H P"P " yj- t-Fi a J. / <", i fcJ purW« 1

58、F>»U i I J I I * ¥-*|Hu4r*P*J.至応電<VfrL TFt+i 報 Jyiiil|1rka IiAh -»f 1-kAM-H, O 初 Witr i » 4f If ht2. 當然我們在這里也可以使用前面介紹過的query執(zhí)行SQL語句。例如我們在void Widget:on_pushButton_clicked()函數(shù)中添加如下代碼:QSqlQuery query = model->query(); query.exec("select n ame from stude nt where id =

59、2 "); query. next();qDebug() << query.value(0).toString();這樣就可以輸出表中的值了,你可以運行程序測試一下。3. 當我們將函數(shù)改為如下。void Widget: on _pushButt on _clicked()QSqlQueryModel *model = new QSqlQueryModel; model->setQuery("select * from stude nt"); model->setHeaderData(O, Qt:Horizo ntal, tr("id"); model->setHeaderData(1, Qt:Horizontal, tr("name"); QTableView *view = new QTableView; view->setModel(model);view->

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論