QT操作數據庫 學習基礎
QT操作數據庫 學習基礎是本文要介紹的內容,對于數據庫相信友們有所接觸,那么先來看本文。
一. 數據庫操作
1.MySql驅動編譯
在windows系統(tǒng)中,我們在mingw,MySql5和Qt4的環(huán)境中編譯MySql驅動主要有以下幾個步驟:
(1)下載
http://www.qtcn.org/download/mingw-utils-0.3.tar.gz 
; 
(2)將mingw-utils-0.3.tar.gz解壓縮,將bin目錄下的reimp 工具復制到 mingw目錄下的bin 里,如果Dev-C++就復制到C:\Dev-Cpp\bin目錄下
(3)將MySql安裝目錄下的include和lib目錄拷貝到沒有空格的路徑下,比如C: \mysql下;
(4)打開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目錄下就會生成一個libmysql.a文件;
(5)接下來執(zhí)行以下命令:
- cd %QTDIR%\src\plugins\sqldrivers\mysql
 - 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項再make編譯,這下便會在%QTDIR%\plugins\sqldrivers目錄下 面生成libqsqlmysql.a, qsqlmysql.dll這兩個文件,然后在程式的.pro文件中添加QT+=sql并在程式開頭包含#include 就能操作數據庫了。
2.完全解決數據庫存儲中文和Qt程式顯示數據庫中文及中文字符串的問題
(1)數據庫和表及表里的字符相關字段(varchar, char, text等)都要使用gbk_chinese_ci這種方式,不這樣做也能,但這樣做,會省非常多麻煩。
(2)重新編譯Qt的MySQL驅動,需要修改src / sql / drivers / mysql / qsql_mysql.cpp文件。要修改的部分如下:第一百零八行的codec函數
- static QTextCodec* codec(MYSQL* mysql)
 - {
 - return QTextCodec::codecForName("GBK");//增加部分
 - #if MYSQL_VERSION_ID >= 32321
 - QTextCodec* heuristicCodec = QTextCodec :: codecForName ( mysql_character_set_name ( mysql ) );
 - if (heuristicCodec)
 - return heuristicCodec;
 - #endif
 - return QTextCodec::codecForLocale();
 - }
 
(3)然后,重新編譯qt的mysql驅動在Qt程式main函數中app后面開頭處加入下面三句,加上這三個是省得不必要的麻煩
- QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));
 - QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK"));
 - QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));
 
(4)在Qt數據庫連接后,運行"SET NAMES ’UTF8’"語句或"SET NAMES ’GBK’"。
- db = QSqlDatabase::addDatabase("QMYSQL");
 - db.setHostName("localhost");
 - db.setDatabaseName("yourdatabase");
 - db.setUserName("yourusername");
 - db.setPassword("yourpassword");
 - db.open();
 - db.exec("SET NAMES ’UTF8’");
 
經過以上四步,就能在Qt程式中直接使用中文字符串,而且能直接使用中文字符串出入于程式和數據庫之間
3.連接MySql數據庫
- QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
 - db.setHostName("localhost");
 - db.setDatabaseName("test");
 - db.setUserName("root");
 - db.setPassword("******");
 - bool ok = db.open();
 
鏈接QSLite數據庫:
- QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
 
#p#
4.SELECT操作
- QSqlQuery query;
 - int numRows;
 - query.exec("SELECT * FROM scores ORDER BY id ASC");
 - while (query.next())
 - {
 - QString name = query.value(0).toString();//query.value()的參數只能是index
 - int salary = query.value(1).toInt();
 - label = setText(QString::number(salary)+name);//測試查詢數據的行數
 - if (db.driver()->hasFeature(QSqlDriver::QuerySize))
 - {
 - numRows = query.size();
 - }
 - else
 - {
 - // this can be very slow
 - query.last();
 - numRows = query.at() + 1;
 - }
 - }
 
5.INSERT操作
(1)直接插入(一條記錄)
- QSqlQuery query;
 - query.exec("INSERT INTO employee (id, name, salary) VALUES (1001, ’Thad Beaumont’, 65000)");
 
(2)通過“:字段”操作
- QSqlQuery query;
 - query.prepare("INSERT INTO employee (id, name, salary) VALUES (:id, :name, :salary)");
 - query.bindValue(":id", 1001);
 - query.bindValue(":name", "Thad Beaumont");
 - query.bindValue(":salary", 65000);
 - query.exec();
 
(3)通過“?”操作
- QSqlQuery query;
 - query.prepare("INSERT INTO employee (id, name, salary) VALUES (?, ?, ?)");
 - query.addBindValue(1001);
 - query.addBindValue("Thad Beaumont");
 - query.addBindValue(65000);
 - query.exec();
 
6.UPDATE操作
- QSqlQuery query;
 - query.exec("UPDATE employee SET salary = 70000 WHERE id = 1003");
 
7.DELETE操作
- QSqlQuery query;
 - query.exec("DELETE FROM employee WHERE id = 1007");
 
8.transaction()操作
有時為了執(zhí)行一系列復雜的操作,使用QSqlDatabase::transaction()能加快速度
- //database為QSqlDatabase對象
 - if(database.driver()->hasFeature(QSqlDriver::Transactions)) //測試數據庫是否支持Transactions,
 - {
 - database.transaction();
 - query.exec("SELECT name FROM scores WHERE id=19");
 - if(query.next())
 - {
 - //str = query.value(0).toString();
 - str = "中國";
 - query.exec("INSERT INTO scores(name) VALUES(’"+str+"’)");
 - }
 - database.commit();
 - }
 
注意,如果str為中文字符串,在SQL語句中需要標明’str’(用單引號括起),如果是英文或數字字符串,能不加單引號(指的是包含在雙引號內的SQL語句)
#p#
9.使用SQL Model類
QSqlQueryModel——一個只讀的讀取數據庫數據的模型
QSqlTableModel——一個可讀寫的單一表格模型,能不用寫SQL語句
QSqlRelationalTableModel——QSqlTableModel的一個子類
這些類都繼承于QAbstractTableModel,而他們又都繼承于QAbstractItemModel
(1) QSqlQueryModel的使用
- QSqlQueryModel querymodel;
 - querymodel.setQuery("SELECT * FROM scores ORDER BY id ASC");
 - for (num=0;numquerymodel.rowCount();num++)
 - {
 - str += QString::number(querymodel.record(num).value("id").toInt());
 - str += " ";
 - str += querymodel.record(num).value("name").toString();
 - //注意這里的value()參數能是index(索引)也能是字段名,前面QSqlQuery的value()參數只能是index
 - str += "\n";
 - }
 - label->setText(str);
 
(2) QSqlTableModel的使用
① 讀取數據
- QSqlTableModel tablemodel;
 - tablemodel.setTable("scores");
 - tablemodel.setFilter("id > 10");
 - tablemodel.setSort(0,Qt::DescendingOrder);
 - tablemodel.select();
 - for (num=0;numtablemodel.rowCount();num++)
 - {
 - str += QString::number(tablemodel.record(num).value("id").toInt());
 - str += " ";
 - str += tablemodel.record(num).value(1).toString();
 - str += "\n";
 - }
 - label->setText(str);
 
② 修改數據
- QSqlTableModel tablemodel;
 - tablemodel.setTable("scores");
 - tablemodel.setFilter("id > 10");
 - tablemodel.setSort(0,Qt::DescendingOrder);
 - tablemodel.select();
 - for (num=0;numtablemodel.rowCount();num++)
 - {
 - QSqlRecord record = tablemodel.record(num);
 - record.setValue("name",record.value("name").toString()+"2");
 - tablemodel.setRecord(num,record);
 - }
 - if(tablemodel.submitAll())
 - label->setText("修改成功!");
 - else
 - label->setText("修改失?。?quot;);
 - 或能用setData()來修改,代碼如下:
 - QSqlTableModel tablemodel;
 - tablemodel.setTable("scores");
 - tablemodel.setFilter("id > 10");
 - tablemodel.setSort(0,Qt::DescendingOrder);
 - tablemodel.select();
 - tablemodel.setData(tablemodel.index(2,1),"data修改");
 - if(tablemodel.submitAll())
 - label->setText("修改成功!");
 - else
 - label->setText("修改失?。?quot;);
 
③ 刪除數據
- tablemodel.removeRows(row, 5);
 - //removeRows()第一個參數為要刪除的第一行的行數,第二個參數為要刪除的總行數;
 - tablemodel.submitAll();
 - //注意,利用QSqlTableModel修改或刪除數據,最后都要使用submitAll()執(zhí)行更改
 
④ 插入數據
- QSqlRecord record = tablemodel.record();
 - record.setValue("name","插入的");
 - tablemodel.insertRecord(2,record);
 
注意,此處插入利用insertRecord()函數,該函數第一個參數為插入到tablemodel的第幾行,第二個參數為記錄,注意這里的記錄一 定要和tablemodel中的記錄匹配,故QSqlRecord record = tablemodel.record();另外,插入操作不用submitAll(),因為,insertRecord()返回bool值。
10.使用QTableView
開頭處要使用#include
- QTableView *view = new QTableView();
 - view->setModel(&model);
 - view->setEditTriggers(QAbstractItemView::NoEditTriggers);
 - view->show();
 
小結:關于QT操作數據庫 學習基礎的內容介紹完了,希望本文對你有所幫助,更多關于數據庫的內容請參考編輯推薦。















 
 
 







 
 
 
 