Qt中MySQL數(shù)據(jù)庫(kù)編程課件_第1頁(yè)
Qt中MySQL數(shù)據(jù)庫(kù)編程課件_第2頁(yè)
Qt中MySQL數(shù)據(jù)庫(kù)編程課件_第3頁(yè)
Qt中MySQL數(shù)據(jù)庫(kù)編程課件_第4頁(yè)
Qt中MySQL數(shù)據(jù)庫(kù)編程課件_第5頁(yè)
已閱讀5頁(yè),還剩15頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、Qt中MySQL數(shù)據(jù)庫(kù)編程Qt使用SQL 主要是下面的幾個(gè)類QSqlDatabase 建立于數(shù)據(jù)庫(kù)的鏈接QSqlQuery 用于執(zhí)行SQL語(yǔ)句QSqlTableModel 結(jié)合QTableView可以輸出數(shù)據(jù)庫(kù)的表貼下我寫的簡(jiǎn)單Democpp view plaincopyprint?1. QSqlDatabasedb=QSqlDatabase:addDatabase(QMYSQL);/becomesthenewdefaultconnection 2. db.setUserName(root);/用戶名 3. db.setPassword(password);/密碼 4. db.setHostN

2、ame(localhost);5. db.setDatabaseName(test);/數(shù)據(jù)庫(kù)名 6. db.setConnectOptions(CLIENT_SSL=1;CLIENT_IGNORE_SPACE=1);/使用SSL 7. db.setPort(3306);/端口 8. if(db.open()9. qDebug()open/ndb.lastError().driverText()/n;10. 11. else12. qDebug()openfaile/n;13. 14. QSqlQueryquery;/用于執(zhí)行SQL語(yǔ)言 15. query.exec(showdatabases

3、);/很方便的 16. while(query.next()17. qDebug()query.value(0).toString()setTable(people);/表名 23. model-setEditStrategy(QSqlTableModel:OnManualSubmit);24. model-select();25. /model-removeColumn(0);/dontshowtheID 26. /model-setHeaderData(0,Qt:Horizontal,QObject:tr(ID); 27. model-setHeaderData(0,Qt:Horizont

4、al,tr(Name);28. model-setHeaderData(1,Qt:Horizontal,tr(Age);29. model-setHeaderData(2,Qt:Horizontal,tr(Sex);30. 31. 32. QTableView*view=newQTableView(this);33. view-setModel(model);34. 35. db.close();36. 37. QGridLayout*gl=newQGridLayout();38. gl-addWidget(view);39. this-setLayout(gl);2、下面是最終的現(xiàn)實(shí)效果如下

5、:現(xiàn)在先做一個(gè)顯示的界面,界面是由一個(gè)表格試圖和三個(gè)按鈕組成。我的大概流程是: 在對(duì)話框窗口先創(chuàng)建一個(gè)柵格布局管理器,添加一個(gè)表格視圖窗口部件。創(chuàng)建一個(gè)水平布局管理器,在水平布局管理器中添加三個(gè)按鈕,最后將水平布局管理器添加到柵格布局管理器中。創(chuàng)建三個(gè)按鈕的信號(hào)與槽數(shù)據(jù)庫(kù)的使用分為三步:(1)QsqlDatabase建立數(shù)據(jù)庫(kù)的鏈接(2)QsqlQuery用于執(zhí)行SQL語(yǔ)句(3)QsqlTableModel結(jié)合QtableView可以輸出數(shù)據(jù)庫(kù)的表。效果測(cè)試點(diǎn)擊connect按鈕鏈接打開數(shù)據(jù)庫(kù)#include#include table.h int main(int argc,char *ar

6、gv) QApplication app(argc,argv); Table *table = new Table; table-show(); return app.exec();#ifndef TABLE_H#define TABLE_H #include#includeclass QGridLayout;class QPushButton;class QHBoxLayout;class Table:public QDialog Q_OBJECT public: /繼承公共對(duì)話框窗體派生類 Table(QWidget *parent = 0); /創(chuàng)建各個(gè)類的指針 QTableView *

7、table; QGridLayout *gridLayout; QPushButton *connectButton; QPushButton *executionButton; QPushButton *displayButton; QHBoxLayout *verticalLayout; private slots:/創(chuàng)建三個(gè)按鈕槽函數(shù) void on_connectButton_clicked(); void on_executionButton_clicked(); void on_displayButton_clicked(); ; #endif#include#include#in

8、clude#include#include table.h Table:Table(QWidget *parent) :QDialog(parent)/創(chuàng)建視圖及按鈕的對(duì)象 table = new QTableView; connectButton = new QPushButton(connect); executionButton = new QPushButton(execution); displayButton = new QPushButton(display);/建立三個(gè)信號(hào)與槽函數(shù)鏈接 connect(connectButton,SIGNAL(clicked(),this,SL

9、OT(on_connectButton_clicked(); connect(executionButton,SIGNAL(clicked(),this,SLOT(on_executionButton_clicked(); connect(displayButton,SIGNAL(clicked(),this,SLOT(on_displayButton_clicked();/創(chuàng)建一個(gè)水平布局管理器,布局三個(gè)按鈕 verticalLayout = new QHBoxLayout; verticalLayout-addWidget(connectButton); verticalLayout-ad

10、dWidget(executionButton); verticalLayout-addWidget(displayButton);/創(chuàng)建一個(gè)柵格布局管理器對(duì)整體窗口部件的排布。 gridLayout = new QGridLayout; gridLayout-addWidget(table,0,0,1,1); gridLayout-addLayout(verticalLayout,1,0,1,1); setLayout(gridLayout);/設(shè)置窗口的大小 resize(500,400); void Table:on_connectButton_clicked()/鏈接函數(shù)實(shí)現(xiàn)數(shù)據(jù)庫(kù)的鏈

11、接功能 QSqlDatabase db = QSqlDatabase:addDatabase(QMYSQL); /添加QMYSQL數(shù)據(jù)庫(kù)驅(qū)動(dòng) db.setHostName(localhost); /設(shè)置登陸的主機(jī)名為localhost db.setUserName(root); /登陸的用戶是超級(jí)用戶 root db.setPassword(123456); /登陸密碼是123456 db.setDatabaseName(student); /打開的數(shù)據(jù)庫(kù)表格,這個(gè)表格式預(yù)先創(chuàng)建好的。用create database student;創(chuàng)建。 bool ok = db.open();/布爾類型,

12、打開數(shù)據(jù)。 if(ok) /if判斷 qDebug()open Database!setTable(employee); /設(shè)置數(shù)據(jù)庫(kù)表上的運(yùn)作模式以employee表名,不選擇從數(shù)據(jù)表格以外獲取信息 model-setEditStrategy(QSqlTableModel:OnManualSubmit); /所有更改將被緩存在模型中,直到submitAll()或revertAll()函數(shù)被調(diào)用 model-select();/select()函數(shù)用于確定一個(gè)或多個(gè)套接口的狀態(tài)。對(duì)每一個(gè)套接口,調(diào)用者可查詢它的可讀性、可寫性及錯(cuò)誤狀態(tài)信息。 model-setHeaderData(0,Qt:H

13、orizontal,QObject:tr(ID); model-setHeaderData(1,Qt:Horizontal,QObject:tr(name); model-setHeaderData(2,Qt:Horizontal,QObject:tr(description); /對(duì)應(yīng)指定的字段并設(shè)置對(duì)應(yīng)的水平標(biāo)題顯示 table-setModel(model); /將這個(gè)數(shù)據(jù)庫(kù)表格模式用視圖顯示出來。 在關(guān)閉對(duì)話框后出現(xiàn)查詢應(yīng)用默認(rèn)數(shù)據(jù)庫(kù)連接錯(cuò)誤:QSqlDatabasePrivate:removeDatabase: connection qt_sql_default_connection

14、 is still in use, all queries will cease to work.我googel以下,參照的內(nèi)容測(cè)試,還是解決不了。在第二個(gè)按鈕末尾添加下面的語(yǔ)句:QString name; name = QSqlDatabase:database().connectionName();QSqlDatabase:removeDatabase(name);On_executionButton_clicked()函數(shù)末尾添加,執(zhí)行SQL語(yǔ)句后關(guān)閉窗口時(shí)有效的,但在on_displayButton_clicked()函數(shù)末尾添加卻沒有效。問題還在解決當(dāng)中。Qt中MySQL數(shù)據(jù)庫(kù)操作首

15、先,要查詢相關(guān)的驅(qū)動(dòng)是否已經(jīng)裝好了,可以用以下的程序進(jìn)行驗(yàn)證:#include #include #include #include int main(int argc, char *argv) QCoreApplication a(argc, argv); qDebug()Available drivers:; QStringList drivers = QSqlDatabase:drivers(); foreach(QString driver, drivers) qDebug() /t driver; return a.exec();結(jié)果如下:接著是連接數(shù)據(jù)庫(kù):#include #inc

16、lude #include bool createConnection() QSqlDatabase db = QSqlDatabase:addDatabase(QMYSQL); db.setDatabaseName(test); db.setUserName(root); db.setPassword(123456); bool ok = db.open(); if(!ok) QMessageBox:critical(0, QObject:tr( 連接數(shù)據(jù)庫(kù)失??! ), db.lastError().text(); return false; else QMessageBox:informa

17、tion(0, QObject:tr(Tips), QObject:tr( 連接數(shù)據(jù)庫(kù)成功! ); return true; int main(int argc, char *argv) QApplication a(argc, argv); QTextCodec *codec= QTextCodec:codecForName(GB2312); QTextCodec:setCodecForLocale(codec); QTextCodec:setCodecForCStrings(codec); QTextCodec:setCodecForTr(codec); if(!createConnect

18、ion() return 1; return a.exec();插入操作:/ODBC 數(shù)據(jù)庫(kù)表示方式QSqlQuery query;query.prepare( “insert into student (id, name) ” “values (:id, :name) ”);query.bindValue(0, 5);query.bindValue(1, “sixth ”);query.exec();/Oracle 表示方式query.prepare( “insert into student (id, name) ” “values (?, ?) ”);query.bindValue(0,

19、 5);query.bindValue(1, “sixth ”);query.exec();/ 使用 addBindValue() 函數(shù),省去了編號(hào),它是按屬性順序賦值的query.prepare( “insert into student (id, name) ” “values (?, ?) ”);query.addBindValue(5);query.addBindValue( “sixth ”);query.exec();/ 使用 ODBC 方法時(shí),可以將編號(hào)用實(shí)際的占位符代替query.prepare( “insert into student (id, name) ” “value

20、s (:id, :name) ”);query.bindValue( “:id ”, 5);query.bindValue( “:name ”, “sixth ”);query.exec();注意:最后一定要執(zhí)行 exec() ,否則上面的語(yǔ)句是不會(huì)被執(zhí)行的。/ 進(jìn)行多個(gè)記錄的插入時(shí),可以利用綁定進(jìn)行批處理QSqlQuery q;q.prepare( “insert into student values (?, ?) ”);QVariantList ints;ints 10 11 12 13;q.addBindValue(ints);QVariantList names;names “xia

21、oming ” “xiaoliang ” “xiaogang ” QVariant(QVariant:String);/ 最后一個(gè)是空字符串,應(yīng)與前面的格式相同q.addBindValue(names);if (!q.execBatch() / 進(jìn)行批處理,如果出錯(cuò)就輸出錯(cuò)誤 qDebug() q.lastError();查詢操作:/ 返回全部的屬性和結(jié)果集QSqlQuery query;query.exec( “select * from student ”);/ 執(zhí)行查詢操作qDebug() “exec next() : ”;if(query.next()/ 開始就先執(zhí)行一次next()

22、函數(shù),那么query 指向結(jié)果集的第一條記錄 int rowNum = query.at(); / 獲取query 所指向的記錄在結(jié)果集中的編號(hào) int columnNum = query.record().count(); / 獲取每條記錄中屬性(即列)的個(gè)數(shù) int fieldNo = query.record().indexOf( “name ”); / 獲取 ” name ”屬性所在列的編號(hào),列從左向右編號(hào),最左邊的編號(hào)為 0 int id = query.value(0).toInt(); / 獲取id 屬性的值,并轉(zhuǎn)換為int 型 QString name = query.valu

23、e(fieldNo).toString(); / 獲取name 屬性的值 qDebug() “rowNum is : ” rowNum / 將結(jié)果輸出 ” id is : ” id ” name is : ” name ” columnNum is : ” columnNum;qDebug() “exec seek(2) : ”;if(query.seek(2)/ 定位到結(jié)果集中編號(hào)為2 的記錄,即第三條記錄,因?yàn)榈谝粭l記錄的編號(hào)為 0 qDebug() “rowNum is : ” query.at() ” id is : ” query.value(0).toInt() ” name is

24、 : ” query.value(1).toString();qDebug() “exec last() : ”;if(query.last()/ 定位到結(jié)果集中最后一條記錄 qDebug() “rowNum is : ” query.at() ” id is : ” query.value(0).toInt() ” name is : ” query.value(1).toString();結(jié)果集其實(shí)就是查詢到的所有記錄的集合,而在QSqlQuery 類中提供了多個(gè)函數(shù)來操作這個(gè)集合,需要注意這個(gè)集合中的記錄是從 0 開始編號(hào)的。最常用的有:seek(int n) :query 指向結(jié)果集的

25、第n 條記錄。first() :query 指向結(jié)果集的第一條記錄。last() :query 指向結(jié)果集的最后一條記錄。next() :query 指向下一條記錄,每執(zhí)行一次該函數(shù),便指向相鄰的下一條記錄。previous() :query 指向上一條記錄,每執(zhí)行一次該函數(shù),便指向相鄰的上一條記錄。record() :獲得現(xiàn)在指向的記錄。value(int n) :獲得屬性的值。其中n 表示你查詢的第n 個(gè)屬性,比方上面我們使用 “ select * from student ”就相當(dāng)于 “ select id, name from student ”,那么value(0) 返回id 屬性的

26、值,value(1) 返回name 屬性的值。該函數(shù)返回QVariant 類型的數(shù)據(jù),關(guān)于該類型與其他類型的對(duì)應(yīng)關(guān)系,可以在幫助中查看QVariant 。at() :獲得現(xiàn)在query 指向的記錄在結(jié)果集中的編號(hào)。需要說明,當(dāng)剛執(zhí)行完query.exec( “select * from student ”); 這行代碼時(shí),query 是指向結(jié)果集以外的,我們可以利用query.next() ,當(dāng)?shù)谝淮螆?zhí)行這句代碼時(shí),query 便指向了結(jié)果集的第一條記錄。當(dāng)然我們也可以利用seek(0) 函數(shù)或者first() 函數(shù)使query 指向結(jié)果集的第一條記錄。但是為了節(jié)省內(nèi)存開銷,推薦的方法是,在q

27、uery.exec( “select * from student ”); 這行代碼前加上query.setForwardOnly(true); 這條代碼,此后只能使用next() 和seek() 函數(shù)。/ 滿足一定條件的結(jié)果集,方法一QSqlQuery query;query.prepare( “select name from student where id = ? ”);int id =2; / 從界面獲取id 的值query.addBindValue(id); / 將id 值進(jìn)行綁定query.exec();query.next(); / 指向第一條記錄qDebug() query.

28、value(0).toString();/ 方法二QSqlQuery query;query. exec( QObject : tr( select * from student where id = %1 ). arg( 2 );if (! query. next() qDebug() none ;else qDebug() query. value( 0 ). toInt() query. value( 1 ). toString();事務(wù)是數(shù)據(jù)庫(kù)的一個(gè)重要功能,所謂事務(wù)是用戶定義的一個(gè)數(shù)據(jù)庫(kù)操作序列,這些操作要么全做要么全不做,是一個(gè)不可分割的工作單位。在Qt 中用transaction

29、() 開始一個(gè)事務(wù)操作,用commit() 函數(shù)或rollback() 函數(shù)進(jìn)行結(jié)束。commit() 表示提交,即提交事務(wù)的所有操作。具體地說就是將事務(wù)中所有對(duì)數(shù)據(jù)庫(kù)的更新寫回到數(shù)據(jù)庫(kù),事務(wù)正常結(jié)束。rollback() 表示回滾,即在事務(wù)運(yùn)行的過程中發(fā)生了某種故障,事務(wù)不能繼續(xù)進(jìn)行,系統(tǒng)將事務(wù)中對(duì)數(shù)據(jù)庫(kù)的所有已完成的操作全部撤銷,回滾到事務(wù)開始時(shí)的狀態(tài)。QSqlQuery query;if(QSqlDatabase:database().transaction() / 啟動(dòng)事務(wù)操作 / 下面執(zhí)行各種數(shù)據(jù)庫(kù)操作 query.exec( “insert into student values

30、(14, hello) ”);query.exec( “delete from student where id = 1 ); / if(!QSqlDatabase:database().commit() qDebug() QSqlDatabase:database().lastError(); / 提交 if(!QSqlDatabase:database().rollback() qDebug() QSqlDatabase:database().lastError(); / 回滾 / 輸出整張表query.exec( “select * from student ”);while(query

31、.next()qDebug() query.value(0).toInt() setQuery( “select * from student ”);model-setHeaderData(0, Qt:Horizontal, tr( “id ”);model-setHeaderData(1, Qt:Horizontal, tr( “name ”);QTableView *view = new QTableView;view-setModel(model);view-show();/QSqlTableModelQSqlTableModel *model;model = new QSqlTable

32、Model(this);model-setTable( “student ”);model-setEditStrategy(QSqlTableModel:OnManualSubmit);model-select(); / 選取整個(gè)表的所有行/ model-removeColumn(1); / 不顯示name 屬性列 , 如果這時(shí)添加記錄,則該屬性的值添加不上ui-tableView-setModel(model);/ ui-tableView-setEditTriggers(QAbstractItemView:NoEditTriggers); / 使其不可編輯/ 過濾model-setFilt

33、er(QObject:tr(“name = %1 ”).arg(name); / 根據(jù)姓名進(jìn)行篩選model-select(); / 顯示結(jié)果/ 刪除操作int curRow = ui-tableView-currentIndex().row(); / 獲取選中的行model-removeRow(curRow); / 刪除該行int ok = QMessageBox:warning(this,tr( “刪除當(dāng)前行! ”),tr( “你確定 ” “刪除當(dāng)前行嗎? ” ), QMessageBox:Yes,QMessageBox:No);if(ok = QMessageBox:No) model-

34、revertAll(); / 如果不刪除,則撤銷elsemodel-submitAll(); / 否則提交,在數(shù)據(jù)庫(kù)中刪除該行/ 插入操作int rowNum = model-rowCount(); / 獲得表的行數(shù)int id = 10;model-insertRow(rowNum); / 添加一行model-setData(model-index(rowNum,0),id);model-submitAll();/ 記得提交/QSqlRelationalTableModel/ create table student (id int primary key, name vchar,course int)/ create table course (id int primary key, name vchar, teacher vchar)model = new QSqlRelation

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論