QT操作数据库 学习基础

移动开发
QT操作数据库 学习基础为友们分享,帮你快速学习并认识数据库的相关操作!

QT操作数据库 学习基础是本文要介绍的内容,对于数据库相信友们有所接触,那么先来看本文。

一. 数据库操作

1.MySql驱动编译

在windows系统中,我们在mingw,MySql5和Qt4的环境中编译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,分别执行以下命令:

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

这样在c:\mysql\lib\opt目录下就会生成一个libmysql.a文件;

(5)接下来执行以下命令:  

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

找到%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();   
}  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

(3)然后,重新编译qt的mysql驱动在Qt程式main函数中app后面开头处加入下面三句,加上这三个是省得不必要的麻烦  

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

(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’");  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

经过以上四步,就能在Qt程式中直接使用中文字符串,而且能直接使用中文字符串出入于程式和数据库之间

3.连接MySql数据库

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

链接QSLite数据库:

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

#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;   
}   
}  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.

5.INSERT操作

(1)直接插入(一条记录)

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

(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();  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

(3)通过“?”操作

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

6.UPDATE操作

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

7.DELETE操作

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

8.transaction()操作

有时为了执行一系列复杂的操作,使用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();   
}  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

注意,如果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);  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

(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);  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

② 修改数据

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()来修改,代码如下:   
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("修改失败!");  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.

③ 删除数据

tablemodel.removeRows(row, 5);   
//removeRows()第一个参数为要删除的第一行的行数,第二个参数为要删除的总行数;   
tablemodel.submitAll();   
//注意,利用QSqlTableModel修改或删除数据,最后都要使用submitAll()执行更改  
  • 1.
  • 2.
  • 3.
  • 4.

④ 插入数据

QSqlRecord record = tablemodel.record();   
record.setValue("name","插入的");   
tablemodel.insertRecord(2,record);  
  • 1.
  • 2.
  • 3.

注意,此处插入利用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(); 
  • 1.
  • 2.
  • 3.
  • 4.

小结:关于QT操作数据库 学习基础的内容介绍完了,希望本文对你有所帮助,更多关于数据库的内容请参考编辑推荐。

责任编辑:zhaolei 来源: 互联网
相关推荐

2009-09-15 09:50:07

Linq操作数据库

2020-11-16 08:56:02

Python

2011-07-05 10:27:06

MySQL数据库检索排序

2011-04-19 10:20:09

数据库

2009-09-03 09:52:26

C# treeview

2009-08-24 16:46:04

C# 泛型

2023-04-27 09:36:43

2023-12-27 13:44:00

数据库系统分布式

2023-12-14 15:07:31

多线程数据库代码

2009-07-07 09:24:37

LINQ检索

2009-08-04 14:52:33

Visual Web ASP.NET

2023-06-15 15:21:43

2016-05-11 10:09:49

数据层代码FastQuery

2011-06-27 12:56:28

2009-12-28 16:57:40

ADO .NET 类

2023-05-23 16:25:48

MyBatisSQL数据库

2022-10-09 15:41:54

Python数据库

2011-07-05 14:46:34

2021-01-29 10:51:48

高并发数据库缓存

2021-06-29 06:25:22

Nest.jsTypeORM数据库
点赞
收藏

51CTO技术栈公众号