成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺析QT MySql操作

移動(dòng)開(kāi)發(fā)
本文介紹的是QT My Sql操作,它是一個(gè)小型關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),另外還有GUI管理工具,例如早先的mysql-front 以及 ems mysql manager,navicat等,現(xiàn)在與C++相結(jié)合的一款軟件。

1.MySql驅(qū)動(dòng)編譯

在windows系統(tǒng)中,我們?cè)趍ingw,MySql5和Qt4的環(huán)境中編譯MySql驅(qū)動(dòng)主要有以下幾個(gè)步驟:

(1)下載 : http://www.qtcn.org/download/mingw-utils-0.3.tar.gz

(2)將mingw-utils-0.3.tar.gz解壓縮,將bin目錄下的reimp 工具復(fù)制到 mingw目錄下的bin 里,如果Dev-C++就復(fù)制到C:\Dev-Cpp\bin目錄下

(3)將MySql安裝目錄下的include和lib目錄拷貝到?jīng)]有空格的路徑下,比如C: \mysql下;

(4)打開(kāi)Qt Command Prompt,分別執(zhí)行以下命令:

cd c:\mysql\lib\opt reimp -d libmysql.lib dlltool -k -d libmysql.def -l libmysql.a

這樣在c:\mysql\lib\opt目錄下就會(huì)生成一個(gè)libmysql.a文件;

(5)接下來(lái)執(zhí)行以下命令:

  1. cd %QTDIR%\src\plugins\sqldrivers\mysql   
  2. qmake -o Makefile "INCLUDEPATH+=C:\MYSQL\INCLUDE" "LIBS+=C :\MYSQL\LIB\OPT\LIBMYSQL.a" mysql.pro  

找到%QTDIR%\src\plugins\sqldrivers\mysql\下的Makefile.release 和 Makefile.debug文件,去掉-llibmysql項(xiàng)再make編譯,這下便會(huì)在%QTDIR%\plugins\sqldrivers目錄下面生成libqsqlmysql.a, qsqlmysql.dll這兩個(gè)文件,然后在程式的.pro文件中添加QT+=sql并在程式開(kāi)頭包含#include 就能操作數(shù)據(jù)庫(kù)了。
2.完全解決數(shù)據(jù)庫(kù)存儲(chǔ)中文和Qt程式顯示數(shù)據(jù)庫(kù)中文及中文字符串的問(wèn)題

(1)數(shù)據(jù)庫(kù)和表及表里的字符相關(guān)字段(varchar, char, text等)都要使用gbk_chinese_ci這種方式,不這樣做也能,但這樣做,會(huì)省非常多麻煩。

(2)重新編譯Qt的MySQL驅(qū)動(dòng),需要修改src / sql / drivers / mysql / qsql_mysql.cpp文件。要修改的部分如下:***百零八行的codec函數(shù)  

  1. static QTextCodec* codec(MYSQL* mysql)   
  2. {   
  3. return QTextCodec::codecForName("GBK");//增加部分   
  4. #if MYSQL_VERSION_ID >= 32321   
  5.    QTextCodec* heuristicCodec = QTextCodec :: codecForName ( mysql_character_set_name ( mysql ) );   
  6. if (heuristicCodec)   
  7.    return heuristicCodec;   
  8. #endif   
  9. return QTextCodec::codecForLocale();   
  10. }  

(3)然后,重新編譯qt的mysql驅(qū)動(dòng)在Qt程式main函數(shù)中app后面開(kāi)頭處加入下面三句,加上這三個(gè)是省得不必要的麻煩  

  1. QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));   
  2. QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK"));   
  3. QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));  

(4)在Qt數(shù)據(jù)庫(kù)連接后,運(yùn)行"SET NAMES ’UTF8’"語(yǔ)句或"SET NAMES ’GBK’"。

  1. db = QSqlDatabase::addDatabase("QMYSQL");   
  2. db.setHostName("localhost");   
  3. db.setDatabaseName("yourdatabase");   
  4. db.setUserName("yourusername");   
  5. db.setPassword("yourpassword");   
  6. db.open();   
  7. db.exec("SET NAMES ’UTF8’");  

經(jīng)過(guò)以上四步,就能在Qt程式中直接使用中文字符串,而且能直接使用中文字符串出入于程式和數(shù)據(jù)庫(kù)之間

#p#

3.連接MySql數(shù)據(jù)庫(kù)

  1. QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");   
  2. db.setHostName("localhost");   
  3. db.setDatabaseName("test");   
  4. db.setUserName("root");   
  5. db.setPassword("******");   
  6. bool ok = db.open(); 

鏈接QSLite數(shù)據(jù)庫(kù):

  1. QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");  

4.SELECT操作

  1. QSqlQuery query;   
  2. int numRows;   
  3. query.exec("SELECT * FROM scores ORDER BY id ASC");   
  4. while (query.next())   
  5. {   
  6. QString name = query.value(0).toString();//query.value()的參數(shù)只能是index   
  7. int salary = query.value(1).toInt();   
  8. label = setText(QString::number(salary)+name);//測(cè)試查詢(xún)數(shù)據(jù)的行數(shù)   
  9. if (db.driver()->hasFeature(QSqlDriver::QuerySize))   
  10. {   
  11.    numRows = query.size();   
  12. }   
  13. else   
  14. {   
  15.    // this can be very slow   
  16.    query.last();   
  17.    numRows = query.at() + 1;   
  18. }   

5.INSERT操作

(1)直接插入(一條記錄)

  1. QSqlQuery query;   
  2. query.exec("INSERT INTO employee (id, name, salary) VALUES (1001, ’Thad Beaumont’, 65000)");  

(2)通過(guò)“:字段”操作

  1. QSqlQuery query;   
  2. query.prepare("INSERT INTO employee (id, name, salary) VALUES (:id, :name, :salary)");   
  3. query.bindValue(":id", 1001);   
  4. query.bindValue(":name", "Thad Beaumont");   
  5. query.bindValue(":salary", 65000);   
  6. query.exec();  

(3)通過(guò)“?”操作

  1. QSqlQuery query;   
  2. query.prepare("INSERT INTO employee (id, name, salary) VALUES (?, ?, ?)");   
  3. query.addBindValue(1001);   
  4. query.addBindValue("Thad Beaumont");   
  5. query.addBindValue(65000);   
  6. query.exec();  

6.UPDATE操作

  1. QSqlQuery query;   
  2. query.exec("UPDATE employee SET salary = 70000 WHERE id = 1003");  

7.DELETE操作

  1. QSqlQuery query;   
  2. query.exec("DELETE FROM employee WHERE id = 1007");  

8.transaction()操作

有時(shí)為了執(zhí)行一系列復(fù)雜的操作,使用QSqlDatabase::transaction()能加快速度

  1. //database為QSqlDatabase對(duì)象   
  2. if(database.driver()->hasFeature(QSqlDriver::Transactions)) //測(cè)試數(shù)據(jù)庫(kù)是否支持Transactions,   
  3. {   
  4. database.transaction();   
  5. query.exec("SELECT name FROM scores WHERE id=19");   
  6. if(query.next())   
  7. {   
  8.       //str = query.value(0).toString();   
  9.       str = "中國(guó)";   
  10.       query.exec("INSERT INTO scores(name) VALUES(’"+str+"’)");   
  11. }   
  12. database.commit();   
  13. }  

注意,如果str為中文字符串,在SQL語(yǔ)句中需要標(biāo)明’str’(用單引號(hào)括起),如果是英文或數(shù)字字符串,能不加單引號(hào)(指的是包含在雙引號(hào)內(nèi)的SQL語(yǔ)句)

 #p#

9.使用SQL Model類(lèi)

QSqlQueryModel——一個(gè)只讀的讀取數(shù)據(jù)庫(kù)數(shù)據(jù)的模型

QSqlTableModel——一個(gè)可讀寫(xiě)的單一表格模型,能不用寫(xiě)SQL語(yǔ)句

QSqlRelationalTableModel——QSqlTableModel的一個(gè)子類(lèi)

這些類(lèi)都繼承于QAbstractTableModel,而他們又都繼承于QAbstractItemModel

(1) QSqlQueryModel的使用

  1. QSqlQueryModel querymodel;   
  2. querymodel.setQuery("SELECT * FROM scores ORDER BY id ASC");   
  3. for (num=0;numquerymodel.rowCount();num++)   
  4. {   
  5. str += QString::number(querymodel.record(num).value("id").toInt());   
  6. str += " ";   
  7. str += querymodel.record(num).value("name").toString();   
  8. //注意這里的value()參數(shù)能是index(索引)也能是字段名,前面QSqlQuery的value()參數(shù)只能是index   
  9. str += "\n";   
  10. }   
  11. label->setText(str);  

(2) QSqlTableModel的使用

① 讀取數(shù)據(jù)

  1. QSqlTableModel tablemodel;  
  2. tablemodel.setTable("scores");   
  3. tablemodel.setFilter("id > 10");   
  4. tablemodel.setSort(0,Qt::DescendingOrder);   
  5. tablemodel.select();   
  6. for (num=0;numtablemodel.rowCount();num++)   
  7. {   
  8. str += QString::number(tablemodel.record(num).value("id").toInt());   
  9. str += " ";   
  10. str += tablemodel.record(num).value(1).toString();   
  11. str += "\n";   
  12. }   
  13. label->setText(str);  

② 修改數(shù)據(jù)

  1. QSqlTableModel tablemodel;   
  2. tablemodel.setTable("scores");   
  3. tablemodel.setFilter("id > 10");   
  4. tablemodel.setSort(0,Qt::DescendingOrder);   
  5. tablemodel.select();   
  6. for (num=0;numtablemodel.rowCount();num++)   
  7. {   
  8. QSqlRecord record = tablemodel.record(num);   
  9. record.setValue("name",record.value("name").toString()+"2");   
  10. tablemodel.setRecord(num,record);   
  11. }   
  12. if(tablemodel.submitAll())   
  13. label->setText("修改成功!");   
  14. else   
  15. label->setText("修改失敗!");  

或能用setData()來(lái)修改,代碼如下:

  1. QSqlTableModel tablemodel;   
  2. tablemodel.setTable("scores");   
  3. tablemodel.setFilter("id > 10");   
  4. tablemodel.setSort(0,Qt::DescendingOrder);   
  5. tablemodel.select();   
  6. tablemodel.setData(tablemodel.index(2,1),"data修改");   
  7. if(tablemodel.submitAll())   
  8.     label->setText("修改成功!");   
  9. else   
  10.     label->setText("修改失敗!");  

③ 刪除數(shù)據(jù)

  1. tablemodel.removeRows(row, 5);   
  2. //removeRows()***個(gè)參數(shù)為要?jiǎng)h除的***行的行數(shù),第二個(gè)參數(shù)為要?jiǎng)h除的總行數(shù);   
  3. tablemodel.submitAll();   
  4. //注意,利用QSqlTableModel修改或刪除數(shù)據(jù),***都要使用submitAll()執(zhí)行更改  

④ 插入數(shù)據(jù)

  1. QSqlRecord record = tablemodel.record();   
  2. record.setValue("name","插入的");   
  3. tablemodel.insertRecord(2,record);   
  4. //注意,此處插入利用insertRecord()函數(shù),該函數(shù)***個(gè)參數(shù)為插入到tablemodel的第幾行,  
  5. 第二個(gè)參數(shù)為記錄,注意這里的記錄一 定要和tablemodel中的記錄匹配,  
  6. 故QSqlRecord record = tablemodel.record();另外,插入操作不用submitAll(),因?yàn)椋琲nsertRecord()返回bool值。   

10.使用QTableView

開(kāi)頭處要使用#include

  1. QTableView *view = new QTableView();   
  2. view->setModel(&model);   
  3. view->setEditTriggers(QAbstractItemView::NoEditTriggers);   
  4. view->show(); 

【編輯推薦】

在VS2008中使用Qt編程

mysql修改、刪除數(shù)據(jù)記錄

深度解析 QT 編譯安裝方法

 Qt 平臺(tái)中使GUI保持響應(yīng)流暢

MySQL導(dǎo)入導(dǎo)出大量數(shù)據(jù)程序?qū)崿F(xiàn)方法

教你如何利用MySQL學(xué)習(xí)MongoDB之安裝篇

責(zé)任編輯:zhaolei 來(lái)源: 網(wǎng)絡(luò)轉(zhuǎn)載
相關(guān)推薦

2011-06-10 13:21:00

Qt 網(wǎng)絡(luò)

2011-06-20 15:13:08

Qt 對(duì)象模型

2011-06-21 13:52:18

Qt 界面

2011-06-10 11:24:08

Qt Quick Designer

2011-06-13 11:07:22

QT 移植

2011-06-15 18:00:26

2011-06-09 18:24:36

QT Wince

2011-06-22 14:04:33

Qt 元類(lèi)型 注冊(cè)

2011-06-10 15:00:02

Qt VC

2009-09-15 13:30:54

linq級(jí)聯(lián)

2011-06-10 14:33:38

Qt VC.NET

2011-06-29 15:14:22

Qt Embedded 鍵盤(pán)

2011-06-29 15:36:21

Qt Embedded 鍵盤(pán)

2010-06-11 10:30:38

MySQL編碼

2011-06-10 09:09:38

Qt Creator OpenCV

2011-06-23 11:16:39

Qt Excel

2011-07-05 14:29:44

Ubuntu QT Mysql

2009-09-10 14:47:53

Linq .NET查詢(xún)

2009-08-17 13:34:02

C#異步操作

2011-07-05 18:04:45

QT Mysql
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 玖玖国产精品视频 | aaaaaaa片毛片免费观看 | 精品91久久| 亚洲一级淫片 | 久久视频一区 | 亚洲免费视频播放 | 国产激情在线 | 看片国产 | 天天射网站 | 欧美不卡一区 | 日韩一区在线播放 | 国产福利资源 | 日韩国产一区二区三区 | 日本手机看片 | 国产精品99久久久精品免费观看 | 欧美日韩高清 | 国产黄色免费网站 | 精品亚洲国产成av人片传媒 | 中文字幕一区二区三区四区五区 | 91 在线| 日本高清视频在线播放 | 91精品亚洲 | 日韩精品在线播放 | 欧美日韩在线视频一区二区 | 中文字幕在线电影观看 | 夜夜骑首页 | 五月综合激情婷婷 | 欧美成人一区二区三区 | 国产日韩欧美精品一区二区 | 中文字幕一区二区三区在线观看 | 视频一区二区中文字幕 | 欧美精品综合在线 | 精品一区二区久久久久久久网站 | 国产区一区二区三区 | 在线免费观看毛片 | 91国产在线视频在线 | 亚洲欧美日韩精品久久亚洲区 | 草草草草视频 | 一区二区三区久久久 | 麻豆久久久久久 | 久草精品在线 |