QT操作数据库 学习基础
使用qt进行数据库访问的方法和步骤

使用qt进行数据库访问的方法和步骤【标题】使用Qt进行数据库访问的方法和步骤【引言】在现代开发中,数据库是不可或缺的一部分。
Qt作为一个功能强大的跨平台开发框架,提供了灵活且易于使用的工具,使开发人员能够轻松地与数据库进行交互。
本文将深入研究使用Qt进行数据库访问的方法和步骤,帮助读者全面了解和掌握该技术。
【摘要】本文将介绍如何通过Qt使用SQL模块来操作数据库。
我们将探讨以下主题:1. 引入Qt的SQL模块;2. 建立与数据库的连接;3. 执行SQL查询和更新操作;4. 使用事务和预处理语句;5. 错误处理和调试。
通过深入的讨论和实际示例,读者将能够掌握Qt中的数据库访问技术。
【正文】一、引入Qt的SQL模块Qt的SQL模块是一个用于操作数据库的框架,支持多种数据库后端,如SQLite、MySQL、PostgreSQL等。
要使用Qt的SQL功能,我们需要在项目中引入Qt的SQL模块,并链接相应的数据库驱动程序。
要引入Qt的SQL模块,我们可以在.pro文件中添加如下代码:```QT += sql```需要注意的是,如果要使用特定的数据库后端,还需要添加相应的数据库驱动程序。
如果要使用SQLite数据库,可以在.pro文件中添加以下代码:```QT += sqlQT += sqlite```二、建立与数据库的连接在进行数据库操作之前,我们首先需要建立与数据库的连接。
Qt提供了一个QSqlDatabase类,用于管理数据库连接。
我们可以通过以下步骤建立与数据库的连接:1. 创建一个QSqlDatabase对象:```QSqlDatabase db = QSqlDatabase::addDatabase("驱动程序名称"); ```其中,"驱动程序名称"可以根据需要指定为相应的数据库后端,如"QMYSQL"、"QSQLITE"等。
qt实训日志

qt实训日志一、前言本篇文章是我在QT实训期间的日志记录,主要记录了我在学习和实践中的思考和收获,以及遇到的问题和解决方法。
二、学习内容1. QT基础知识在开始实训之前,我们首先学习了QT的基础知识,包括QT的安装、界面设计、信号与槽机制等。
其中,信号与槽机制是QT最重要的特性之一,它可以将不同对象之间的交互行为进行解耦,使得代码更加清晰和易于维护。
2. QT网络编程随着互联网技术的发展,网络编程已经成为了一项非常重要的技能。
在QT实训中,我们也学习了QT网络编程相关知识,包括TCP/IP协议、Socket编程等。
通过这些知识的学习和实践,我们能够更加深入地理解网络编程的本质,并且能够独立完成基本的网络应用开发。
3. QT数据库开发数据库是现代软件开发中不可或缺的一部分。
在QT实训中,我们也学习了QT数据库开发相关知识,并且使用SQLite作为数据库进行实践。
通过这些知识的学习和实践,我们能够更加深入地了解数据库的设计和使用,以及如何在QT中进行数据库操作。
三、实践项目1. 聊天室聊天室是我们在QT实训中完成的第一个项目。
通过这个项目,我们学习了QT网络编程相关知识,并且实现了一个基本的聊天室应用。
在这个项目中,我们使用了TCP/IP协议进行通信,并且使用了QT的信号与槽机制来处理用户输入和服务器响应。
2. 学生成绩管理系统学生成绩管理系统是我们在QT实训中完成的第二个项目。
通过这个项目,我们学习了QT数据库开发相关知识,并且实现了一个基本的学生成绩管理系统。
在这个项目中,我们使用了SQLite作为数据库,并且使用了QT的模型/视图框架来显示数据。
3. 图书馆管理系统图书馆管理系统是我们在QT实训中完成的第三个项目。
通过这个项目,我们进一步深入地学习了QT数据库开发相关知识,并且实现了一个复杂的图书馆管理系统。
在这个项目中,我们不仅使用了SQLite 作为数据库,还使用了多线程编程来提高程序性能。
QT与SQLite数据库学习资料

当然我们一定要记住这个顺序,先创建数据库,然后再去创建一个表(作为菜鸟的我犯这个错误了),还有一点需要注意的红色标记的那句话,我参考的数籍一般都这样写db.setDatabaseName(":memory:");这样就把生成的数据库文件是在内存当中的,在工程文件目录下找不到。
上面使我们创建了一个数据库和一个表,那么我们如何把它呈现在我们的QTableview部件上呢?QSqlTableModel *model = new QSqlTableModel;model->setTable("person");model->setEditStrategy(QSqlTableModel::OnManualSubmit);model->select();ui->tableView->setModel(model);ui->tableView->show();上面的代码就把数据库中的信息不加筛选的打印到控件上了。
第一次写博客大家多多包涵。
Qt中提高sqlite的读写速度SQLite数据库本质上来讲就是一个磁盘上的文件,所以一切的数据库操作其实都会转化为对文件的操作,而频繁的文件操作将会是一个很好时的过程,会极大地影响数据库存取的速度。
例如:向数据库中插入100万条数据,在默认的情况下如果仅仅是执行query.exec("insert into DataBase(......)values(......)");就会打开和关闭文件100万次,所以速度当然会很慢。
SQLite 数据库是支持事务操作的,于是我们就可以通过事务来提高数据库的读写速度。
事务的基本原理是:数据库管理系统首先会把要执行的sql语句存储到内存当中,只有当commit()的时候才一次性全部执行所有内存中的数据库。
下面是一个简单的QT sqlite数据库事务的例子:#include <QtCore/QCoreApplication>#include <QtSql>#include <iostream>using namespace std;int main(int argc, char *argv[]){QCoreApplication a(argc, argv);QSqlDatabase db_sqlite = QSqlDatabase::addDatabase("QSQLITE", "connSQLite");db_sqlite.setDatabaseName("SQLiteDB.db3");db_sqlite.open();QSqlQuery query("", db_sqlite);bool bsuccess = false;QTime tmpTime;// 开始启动事务db_sqlite.transaction();tmpTime.start();for(int i = 0; i<100000; i++){bsuccess = query.exec("insert into DataBase(D_1,D_2,D_3,D_4,D_5) values('TT','TT','TT','TT','TT')");if (!bsuccess){cout<<"Error occur"<<endl;break;}}// 提交事务,这个时候才是真正打开文件执行SQL语句的时候db_mit();cout<<"10000条数据耗时:"<<tmpTime.elapsed()<<"ms"<<endl;}其实QT 操作sqlite数据库增加事务的功能就是上面例子中蓝色字体标出的两句话,如果去掉这两句话,程序又会还原为:打开文件——执行query.exec(...)——关闭文件。
Qt数据库操作

3.修改main.cpp中的内容如下。 #include <QtCore/QCoreApplication> #include <QtSql> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QSqlDatabase db = QSqlDatabase::addDatabase(“QSQLITE”); //添加数据库驱动 db.setDatabaseName(“:memory:”); //数据库连接命名 if(!db.open()) //打开数据库 { return false; } QSqlQuery query; //以下执行相关QSL语句 query.exec(“create table student(id int primary key,name varchar)”); //新建student表,id设置为主键,还有一个name项 query.exec(“insert into student values(1,’xiaogang’)”); query.exec(“insert into student values(2,’xiaoming’)”); query.exec(“insert into student values(3,’xiaohong’)”); //向表中插入3条记录 query.exec(“select id,name from student where id >= 2″); //查找表中id >=2 的记录的id项和name项的值 while(query.next()) //query.next()指向查找到的第一条记录,然后每次后移一条记录 { int ele0 = query.value(0).toInt(); //query.value(0)是id的值,将其转换为int型 QString ele1 =query.value(1).toString(); qDebug() << ele0 <<ele1 ; //输出两个值 } } return a.exec();
Qt基础教程之ModelView(模型视图)结构

Model/View(模型/视图)结构是Qt 中用界面组件显示与编辑数据的一种结构,视图(View)是显示和编辑数据的界面组件,模型(Model)是视图与原始数据之间的接口。
GUI 应用程序的一个很重要的功能是由用户在界面上编辑和修改数据,典型的如数据库应用程序。
数据库应用程序中,用户在界面上执行各种操作,实际上是修改了界面组件所关联的数据库内的数据。
将界面组件与所编辑的数据分离开来,又通过数据源的方式连接起来,是处理界面与数据的一种较好的方式。
Qt 使用 Model/View 结构来处理这种关系,Model/View 的基本结构如图 1 所示。
图 1 Model/View基本结构其中各部分的功能如下:•数据(Data)是实际的数据,如数据库的一个数据表或SQL查询结果,内存中的一个 StringList,或磁盘文件结构等。
•视图或视图组件(View)是屏幕上的界面组件,视图从数据模型获得每个数据项的模型索引(model index),通过模型索引获取数据,然后为界面组件提供显示数据。
Qt 提供一些现成的数据视图组件,如 QListView、QTreeView 和QTableView 等。
•模型或数据模型(Model)与实际数据通信,并为视图组件提供数据接口。
它从原始数据提取需要的内容,用于视图组件进行显示和编辑。
Qt 中有一些预定义的数据模型,如 QStringListModel 可作为 StringList 的数据模型,QSqlTableModel 可以作为数据库中一个数据表的数据模型。
由于数据源与显示界面通过 Model/View 结构分离开来,因此可以将一个数据模型在不同的视图中显示,也可以在不修改数据模型的情况下,设计特殊的视图组件。
在 Model/View 结构中,还提供了代理(Delegate)功能,代理功能可以让用户定制数据的界面显示和编辑方式。
在标准的视图组件中,代理功能显示一个数据,当数据被编辑时,代理通过模型索引与数据模型通信,并为编辑数据提供一个编辑器,一般是一个 QLineEdit 组件。
Qt基础教程二进制文件操作

除了文本文件之外,其他需要按照一定的格式定义读写的文件都称为二进制文件。
每种格式的二进制文件都有自己的格式定义,写入数据时按照一定的顺序写入,读出时也按照相应的顺序读出。
例如地球物理中常用的 SEG-Y 格式文件,必须按照其标准格式要求写入数据才符合这种文件的格式规范,读取数据时也需要按照格式定义来读出。
Qt使用 QFile 和 QDataStream 进行二进制数据文件的读写:•QFile 负责文件的 IO 设备接口,即与文件的物理交互;•QDataStream 以数据流的方式读取文件内容或写入文件内容。
本节以实例中演示二进制文件的读写,图 1 是程序运行的界面。
图 1二进制文件读写功能实例以表格形式编辑一个数据表,采用 Model/View 结构,编辑后的数据保存为二进制文件,这与前面所讲的用纯文本文件存储数据不同。
根据QDataStream 保存文件时使用的数据编码的方式不同,可以保存为两种文件:1.用 Qt 预定义编码保存各种类型数据的文件,定义文件后缀为“.stm”。
Qt 预定义编码是指在写入某个类型数据,如整形数、字符串等到文件流时,使用 Qt 预定义的编码。
可以将这种Qt预定义数据格式编码类比于 HTML 的标记符,Qt 写入某种类型数据时用了 Qt 预定义的标记符,读出数据时,根据标记符读出数据。
使用 Qt 预定义编码保存的流文件,某些字节是 QDataStream 自己写入的,我们并不完全知道文件内每个字节的意义,但是用 QDataStream 可以读出相应的数据。
2.标准编码数据文件,定义文件后缀为“.dat”。
在将数据写到文件时,完全使用数据的二进制原始内容,每个字节都有具体的定义,在读出数据时,只需根据每个字节的定义读出数据即可。
实例 samp7_2 具有如下功能:•可以在表格内编辑数据,同样的表格数据内容可以保存为两种格式的文件,Qt 预定义编码文件(stm文件)和标准编码文件(dat文件);•界面上的表格数据可以修改,可以添加行、插入行、删除行;•可以读取 stm 文件或 dat 文件,虽然文件格式不一样,但对相同的界面数据表存储的文件的实质内容是一样的。
qt编程快速入门 例程
qt编程快速入门例程Qt是一种跨平台的C++应用程序开发框架,它能够帮助开发者快速入门编写高效、稳定的应用程序。
本文将介绍一些快速入门的例程,帮助读者更好地理解和掌握Qt编程。
一、Qt的安装和配置在开始Qt编程之前,首先需要安装Qt开发环境,并进行相应的配置。
读者可以从Qt官网上下载并安装Qt Creator,这是一个集成开发环境,提供了丰富的工具和功能,方便快捷地进行开发工作。
安装完成后,还需要进行一些配置工作,例如设置编译器、配置Qt 版本等。
二、创建第一个Qt程序在Qt Creator中,可以通过创建一个新项目来开始Qt编程。
选择“File”菜单下的“New File or Project”,选择“Qt Widgets Application”,填写项目名称和路径,点击“Next”。
然后选择“Desktop Qt”版本,并选择“Widgets Application”,点击“Next”。
最后,选择项目的相关设置,点击“Finish”完成项目创建。
三、Qt的基本概念Qt的编程基础包括了一些重要的概念,例如信号和槽机制、事件处理、界面设计等。
在Qt中,信号和槽机制是一种非常重要的事件通信机制,它可以实现对象之间的通信和数据传递。
通过定义信号和槽函数,可以在特定事件发生时,自动触发槽函数执行相应的操作。
四、界面设计Qt提供了丰富的界面设计工具,可以帮助开发者快速创建用户界面。
在Qt Creator中,可以通过拖拽和放置控件的方式进行界面设计。
控件可以是按钮、文本框、标签等,开发者可以根据需求选择合适的控件进行设计,并设置相应的属性和布局。
五、事件处理Qt的事件处理机制是一种非常重要的编程方式,通过捕捉和处理事件,可以实现对用户输入的响应。
在Qt中,每个控件都可以接收和处理事件,例如鼠标点击事件、键盘事件等。
在事件处理函数中,可以编写相应的代码来处理特定事件,例如改变控件的显示内容、执行特定的操作等。
qt 基础知识梳理
qt 基础知识梳理QT基础知识梳理QT是一种跨平台的C++应用程序开发框架,通过QT,开发者可以方便地编写可在不同操作系统上运行的应用程序。
本文将梳理一些QT的基础知识,帮助读者了解QT的核心概念和常用功能。
一、QT概述QT是由挪威的Trolltech公司开发的一种C++应用程序开发框架,其目标是提供一种简单、易用、跨平台的开发环境。
QT采用了一种特殊的信号与槽机制,使得开发者可以方便地处理对象之间的事件和通信。
QT还提供了丰富的图形界面控件和工具类,以及强大的跨平台支持,使得开发者可以快速地开发出高质量的应用程序。
二、QT的核心概念1. 对象和类:在QT中,所有的组件都是对象,对象是类的实例。
类定义了对象的属性和行为,开发者可以通过继承和多态等方式来扩展和定制类的功能。
2. 信号与槽机制:信号与槽是QT的核心机制,它通过一种松耦合的方式实现了对象之间的通信。
一个对象可以发送信号,而其他对象可以接收这个信号并作出相应的反应。
开发者可以通过connect 函数将信号和槽函数连接起来,实现对象之间的交互。
3. 事件驱动编程:QT采用了事件驱动的编程方式,当用户执行某个操作时,系统会生成相应的事件,然后QT会将事件发送给相关的对象,对象再根据事件的类型和参数来执行相应的操作。
4. 常用的QT类:QT提供了丰富的类库,包括图形界面控件、文件操作、网络通信、数据库访问等功能。
常用的类有QWidget、QLabel、QPushButton、QLineEdit、QSpinBox等,开发者可以根据自己的需求选择合适的类来构建界面和实现功能。
三、QT的常用功能1. 图形界面开发:QT提供了丰富的图形界面控件和布局管理器,开发者可以通过拖拽和设置属性的方式来构建界面。
同时,QT还提供了强大的绘图和动画功能,可以实现各种复杂的图形效果。
2. 事件处理:QT中的事件可以分为系统事件和自定义事件。
系统事件包括鼠标点击、键盘输入等用户操作,开发者可以通过重写事件处理函数来响应这些事件。
二十五、Qt数据库(五)QSqlQueryModel
二十五、Qt数据库(五)QSqlQueryModel本文章原创于转载请注明出处。
在上一篇的最后我们说到,Qt中使用了自己的机制来避免使用SQL语句,它为我们提供了更简单的数据库操作和数据显示模型。
它们分别是只读的QSqlQueryModel,操作单表的QSqlTableModel和以及可以支持外键的QSqlRelationalTableModel。
这次我们先讲解QSqlQueryModel。
QSqlQueryModel类为SQL的结果集提供了一个只读的数据模型,下面我们先利用这个类进行一个最简单的操作。
我们新建Qt4 Gui Application工程,我这里工程名为queryModel ,然后选中QtSql 模块,Base class选QWidget。
工程建好后,添加C++ Header File ,命名为database.h,更改其内容如下:#ifndef DATABASE_H#define DATABASE_H#include <QSqlDatabase>#include <QSqlQuery>static bool createConnection(){QSqlDatabase db = QSqlDatabase::addDatabase(“QSQLITE”);db.setDatabaseName(“database.db”);if(!db.open()) return false;QSqlQuery query;query.exec(“create table student (id int primary key, name vchar)”);query.exec(“insert into student values (0,’yafei0′)”);query.exec(“insert into student values (1,’yafei1′)”);query.exec(“insert into student values (2,’yafei2′)”);return true;}#endif // DATABASE_H这里我们使用了db.setDatabaseName(“database.db”);,我们没有再使用以前的内存数据库,而是使用了真实的文件,这样后面对数据库进行的操作就能保存下来了。
Qt基础教程之QStandardItemModel用法
本节介绍 QStandardltemModel 的使用,主要用到以下 3 个类:1.QStandardItemModel:基于项数据的标准数据模型,可以处理二维数据。
维护一个二维的项数据数组,每个项是一个 QStandardltem 类的变量,用于存储项的数据、字体格式、对齐方式等。
2.QTableView:二维数据表视图组件,有多个行和多个列,每个基本显示单元是一个单元格,通过 setModel() 函数设置一个 QStandardItemModel 类的数据模型之后,一个单元格显示 QStandardItemModel 数据模型中的一个项。
3.QItemSelectionModel:一个用于跟踪视图组件的单元格选择状态的类,当在QTableView 选择某个单元格,或多个单元格时,通过 QItemSelectionModel 可以获得选中的单元格的模型索引,为单元格的选择操作提供方便。
这几个类之间的关系是:QTableView 是界面视图组件,其关联的数据模型是 QStandardItem Model,关联的项选择模型是 QItemSelectionModel,QStandardItemModel 的数据管理的基本单元是 QStandardItem。
实例中演示 QStandardItemModel 的使用,其运行时界面如图 1 所示。
图 1运行时界面该实例具有如下功能:•打开一个纯文本文件,该文件是规则的二维数据文件,通过字符串处理获取表头和各行各列的数据,导入到一个 QStandardItemModel 数据模型。
•编辑修改数据模型的数据,可以插入行、添加行、删除行,还可以在QTableView 视图组件中直接修改单元格的数据内容。
•可以设置数据模型中某个项的不同角色的数据,包括文字对齐方式、字体是否粗体等。
•通过 QItemSelectionModel 获取视图组件上的当前单元格,以及选择单元格的范围,对选择的单元格进行操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
QT操作数据库学习基础QT操作数据库学习基础是本文要介绍的内容,对于数据库相信友们有所接触,那么先来看本文。
一.数据库操作1.MySql驱动编译在windows系统中,我们在mingw,MySql5和Qt4的环境中编译MySql驱动主要有以下几个步骤:(1)下载/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找到%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) { returnQTextCodec::codecForName("GBK");//增加部分#if MYSQL_VERSION_ID >= 32321 QTextCodec* heuristicCodec = QTextCodec :: codecForName( mysql_character_set_name ( mysql ) ); if (heuristicCodec) return heuristicCodec; #endifreturn QTextCodec::codecForLocale(); }(3)然后,重新编译qt的mysql驱动在Qt程式main函数中app后面开头处加入下面三句,加上这三个是省得不必要的麻烦QTextCodec::setCodecForLocale(QTextCodec::codecFor Name("GBK"));QTextCodec::setCodecForCStrings(QTextCodec::codecF orName("GBK"));QTextCodec::setCodecForTr(QTextCodec::codecForNam e("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");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 st(); 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()操作有时为了执行一系列复杂的操作,使用QSqlDatabase::transaction()能加快速度//database为QSqlDatabase对象if(database.driver()->hasFeature(QSqlDriver::Transacti ons)) //测试数据库是否支持Transactions,{ database.transaction(); query.exec("SELECT nameFROM scores WHERE id=19"); if(query.next()){ //str = query.value(0).toString(); str = "中国"; query.exec("INSERT INTO scores(name) VALUES(’"+str+"’)"); } mit(); }注意,如果str为中文字符串,在SQL语句中需要标明’str’(用单引号括起),如果是英文或数字字符串,能不加单引号(指的是包含在双引号内的SQL语句)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("修改失败!"); 或能用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("修改失败!");③ 删除数据tablemodel.removeRows(row, 5);//removeRows()第一个参数为要删除的第一行的行数,第二个参数为要删除的总行数;tablemodel.submitAll(); //注意,利用QSqlTableModel修改或删除数据,最后都要使用submitAll()执行更改④ 插入数据QSqlRecord record = tablemodel.record(); record.setValue("name","插入的");tablemodel.insertRecord(2,record);注意,此处插入利用insertRecord()函数,该函数第一个参数为插入到tablemodel的第几行,第二个参数为记录,注意这里的记录一定要和tablemodel中的记录匹配,故QSqlRecord record = tablemodel.record();另外,插入操作不用submitAll(),因为,insertRecord()返回bool值。