詳解QT中數(shù)據(jù)庫(kù)相關(guān)操作
QT中數(shù)據(jù)庫(kù)的相關(guān)操作是本文要介紹的內(nèi)容,主要是來(lái)了解在QT中數(shù)據(jù)庫(kù)的操作,文章很詳細(xì)的講解的關(guān)于數(shù)據(jù)庫(kù)的操作,具體來(lái)看內(nèi)容。
數(shù)據(jù)庫(kù)操作
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í)行以下命令:
- 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項(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ù)
- 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驅(qū)動(dòng)在Qt程式main函數(shù)中app后面開(kāi)頭處加入下面三句,加上這三個(gè)是省得不必要的麻煩
- QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));
- QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK"));
- QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));
(4)在Qt數(shù)據(jù)庫(kù)連接后,運(yùn)行"SET NAMES ’UTF8’"語(yǔ)句或"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’");
經(jīng)過(guò)以上四步,就能在Qt程式中直接使用中文字符串,而且能直接使用中文字符串出入于程式和數(shù)據(jù)庫(kù)之間
3、連接MySql數(shù)據(jù)庫(kù)
- QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
- db.setHostName("localhost");
- db.setDatabaseName("test");
- db.setUserName("root");
- db.setPassword("******");
- bool ok = db.open();
鏈接QSLite數(shù)據(jù)庫(kù):
- QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
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()的參數(shù)只能是index
- int salary = query.value(1).toInt();
- label = setText(QString::number(salary)+name);//測(cè)試查詢數(shù)據(jù)的行數(shù)
- 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)通過(guò)“:字段”操作
- 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)通過(guò)“?”操作
- 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()操作
有時(shí)為了執(zhí)行一系列復(fù)雜的操作,使用QSqlDatabase::transaction()能加快速度
- //database為QSqlDatabase對(duì)象
- if(database.driver()->hasFeature(QSqlDriver::Transactions)) //測(cè)試數(shù)據(jù)庫(kù)是否支持Transactions,
- {
- database.transaction();
- query.exec("SELECT name FROM scores WHERE id=19");
- if(query.next())
- {
- //str = query.value(0).toString();
- str = "中國(guó)";
- query.exec("INSERT INTO scores(name) VALUES(’"+str+"’)");
- }
- database.commit();
- }
注意,如果str為中文字符串,在SQL語(yǔ)句中需要標(biāo)明’str’(用單引號(hào)括起),如果是英文或數(shù)字字符串,能不加單引號(hào)(指的是包含在雙引號(hào)內(nèi)的SQL語(yǔ)句)
9、使用SQL Model類
- QSqlQueryModel——一個(gè)只讀的讀取數(shù)據(jù)庫(kù)數(shù)據(jù)的模型
- QSqlTableModel——一個(gè)可讀寫(xiě)的單一表格模型,能不用寫(xiě)SQL語(yǔ)句
- QSqlRelationalTableModel——QSqlTableModel的一個(gè)子類
這些類都繼承于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()參數(shù)能是index(索引)也能是字段名,前面QSqlQuery的value()參數(shù)只能是index
- str += "\n";
- }
- label->setText(str);
(2) QSqlTableModel的使用
① 讀取數(shù)據(jù)
- 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);
② 修改數(shù)據(jù)
- 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("修改失??!");
- 或能用setData()來(lái)修改,代碼如下:
- 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("修改失??!");
③ 刪除數(shù)據(jù)
- tablemodel.removeRows(row, 5);
- //removeRows()***個(gè)參數(shù)為要?jiǎng)h除的***行的行數(shù),第二個(gè)參數(shù)為要?jiǎng)h除的總行數(shù);
- tablemodel.submitAll();
- //注意,利用QSqlTableModel修改或刪除數(shù)據(jù),***都要使用submitAll()執(zhí)行更改
④ 插入數(shù)據(jù)
- QSqlRecord record = tablemodel.record();
- record.setValue("name","插入的");
- tablemodel.insertRecord(2,record);
- //注意,此處插入利用insertRecord()函數(shù),該函數(shù)***個(gè)參數(shù)為插入到tablemodel的第幾行,
- 第二個(gè)參數(shù)為記錄,注意這里的記錄一 定要和tablemodel中的記錄匹配,
- 故QSqlRecord record = tablemodel.record();另外,插入操作不用submitAll(),因?yàn)?,insertRecord()返回bool值。
10、使用QTableView
開(kāi)頭處要使用#include
- QTableView *view = new QTableView();
- view->setModel(&model);
- view->setEditTriggers(QAbstractItemView::NoEditTriggers);
- view->show();
小結(jié):詳解QT中數(shù)據(jù)庫(kù)相關(guān)操作的內(nèi)容介紹完了,希望通過(guò)本文的學(xué)習(xí)能對(duì)你有所幫助!