Qt 数据库操作(二)
文章目录
- 执行SQL语句
- 1、执行一个查询
- 2、浏览结果集
- 3、插入、更新和删除记录
- 4、事务
执行SQL语句
1、执行一个查询
QSqlQuery类提供了一个接口,用于执行SQL语句和浏览查询的结果集。
要执行一个SQL语句,只需要简单地创建一个QSqlQuery 对象,然后调用QSqlQuery::exec()函数即可。
例如:
QSqlQuery query:
query.exec(“select * from student”);
在QSqlQuery的构造函数中可以接受一个可选的QSqlDatabase对象来指定使用哪一个数据库连接。 当没有指定连接时,就是默认连接。
如果发生了错误,那么exec()函数会返回false, 可以使用QSqlQuery::lastError()来获取错误信息。
2、浏览结果集
QsqlQuery 提供了对结果集的访问,可以一次访问一条记录。当执行完exec()函数后,QSqlQuery的内部指针会位于第一条记录前面的位置。必须调用一次QSqlQuery:next()函数来使其前进到第一条记录,然后可以重复使用next()函数来访问其他的记录,直到该函数的返回值为false。
遍历一个结果集:
while(query1.next())
{qDebug() << query1.value(0).toInt() << query1.value(1).toString();
}
在QSqlquery类中提供了多个函数来实现在结果集中进行定位,比如:
next()定位到下一条记录。
previous 定位到前一条记录;
first () 定位到第一条记录;
seek()定位到第n条记录;
at()返回当前行的索引;
record()函数可以返回当前指向的记录里;
size()返回结果集中的总行数。
QSqlDriver::hasFeature() 数据库支持的特性。
项目示例:
#ifndef CONNECTION_H#define CONNECTION_H
#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlQuery>static bool createConnection()
{// 创建一个数据库连接,使用“connection1”为连接名QSqlDatabase db1 = QSqlDatabase::addDatabase("QSQLITE", "connection1");db1.setDatabaseName("my1.db");if (!db1.open()) {QMessageBox::critical(0, "Cannot open database1","Unable to establish a database connection.", QMessageBox::Cancel);return false;}// 这里要指定连接QSqlQuery query1(db1);query1.exec("create table student (id int primary key, ""name varchar(20))");query1.exec("insert into student values(0, 'LiMing')");query1.exec("insert into student values(1, 'LiuTao')");query1.exec("insert into student values(2, 'WangHong')");// 创建另一个数据库连接,要使用不同的连接名,这里是“connection2”QSqlDatabase db2 = QSqlDatabase::addDatabase("QSQLITE", "connection2");db2.setDatabaseName("my2.db");if (!db2.open()) {QMessageBox::critical(0, "Cannot open database1","Unable to establish a database connection.", QMessageBox::Cancel);return false;}// 这里要指定连接QSqlQuery query2(db2);query2.exec("create table student (id int primary key, ""name varchar(20))");query2.exec("insert into student values(10, 'LiQiang')");query2.exec("insert into student values(11, 'MaLiang')");query2.exec("insert into student values(12, 'ZhangBin')");return true;
}#endif // CONNECTION_H
#include <QApplication>#include <QSqlDatabase>
#include <QDebug>
#include <QStringList>
#include "connection.h"
#include <QVariant>
#include <QSqlDriver>
#include <QSqlRecord>
#include <QSqlField>int main(int argc, char *argv[])
{QApplication a(argc, argv);// 创建数据库连接if (!createConnection()) return 1;// 使用QSqlQuery查询连接1的整张表,先要使用连接名获取该连接QSqlDatabase db1 = QSqlDatabase::database("connection1");QSqlQuery query1(db1);qDebug() << "connection1:";query1.exec("select * from student");while(query1.next()){qDebug() << query1.value(0).toInt() << query1.value(1).toString();}// 使用QSqlQuery查询连接2的整张表QSqlDatabase db2 = QSqlDatabase::database("connection2");QSqlQuery query2(db2);qDebug() << "connection2:";query2.exec("select * from student");while(query2.next()){qDebug() << query2.value(0).toInt() << query2.value(1).toString();}
// 以下是在例程17-4中添加的代码int numRows;// 先判断该数据库驱动是否支持QuerySize特性,如果支持,则可以使用size()函数,// 如果不支持,那么就使用其他方法来获取总行数if (db2.driver()->hasFeature(QSqlDriver::QuerySize)) {qDebug() << "has feature: query size";numRows = query2.size();} else {qDebug() << "no feature: query size";query2.last();numRows = query2.at() + 1;}qDebug() << "row number: " << numRows;// 指向索引为1的记录,即第二条记录query2.seek(1);// 返回当前索引值qDebug() << "current index: " << query2.at();// 获取当前行的记录QSqlRecord record = query2.record();// 获取记录中“id”和“name”两个属性的值int id = record.value("id").toInt();QString name = record.value("name").toString();qDebug() << "id: " << id << "name: " << name;// 获取索引为1的属性,即第二个属性QSqlField field = record.field(1);// 输出属性名和属性值,结果为“name”和“MaLiang”qDebug() << "second field: " << field.name()<< "field value: " << field.value().toString();return a.exec();
}
3、插入、更新和删除记录
插入一条记录:
query2.exec(“insert into student (id, name) values (100, chenyun)”);
插入多条记录:
// 下面是与上面代码等价的名称绑定实现代码// query2.prepare("insert into student (id, name) values (:id, :name)");// int idValue = 100;// QString nameValue = "ChenYun";// query2.bindValue(":id", idValue);// query2.bindValue(":name", nameValue);// query2.exec();// 下面是与上面代码等价的位置绑定实现代码// query2.prepare("insert into student (id, name) values (?, ?)");// int idValue = 100;// QString nameValue = "ChenYun";// query2.addBindValue(idValue);// query2.addBindValue(nameValue);// query2.exec();// 批处理query2.prepare("insert into student (id, name) values (?, ?)");QVariantList ids;ids << 20 << 21 << 22;query2.addBindValue(ids);QVariantList names;names << "xiaoming" << "xiaoliang" << "xiaogang";query2.addBindValue(names);if(!query2.execBatch()) qDebug() << query2.lastError();
对于记录的更新和删除,它们和插入操作是相似的,并且也可以使用占位符。
**// 更新**query2.exec("update student set name = 'xiaohong' where id = 20");
**// 删除**
query2.exec("delete from student where id = 21");query2.exec("select * from student");
while(query2.next())
{qDebug() << query2.value(0).toInt() << query2.value(1).toString();
}
4、事务
事务可以保证一个复杂操作的原子性。就是对于一个数据库的操作序列,这些操作要么全部做完,要么一条也不做,它是一个不可分割的工作单位。
在Qt中,如果底层的数据库引擎支持事务,那么
QSqlDatabase::hasFeature(QSqlDriver::Transactions)会返回true。
可以使用QSqlDatabase::transaction()来启动一个事务,
然后编写一些希望在事务中执行的SQL语句,
最后调用QSqlDatabase::commit()或者QSqlDatabase::rollback()。
当使用事务时必须在创建查询以前就开始事务,例如:
QSqlDatabase::database().transaction();
QSqlQuery query3;
query3.exec(“SELECT ID FROM employee WHERE name = Torid Halvorsen”);
if(query3.next())
{
int employeeId = query3.value(0).toInt();
query3.exec(“INSERT INTO project(id,name,ownerid)” “VALUES(201,Manhattan Project,”+ QString::number(employeeId)+"")");
}
QSqlDatabase::database().commit();
本文档整理来源自《QtCreator 快速入门》。。。。
Qt 数据库操作(二)相关推荐
- Qt数据库操作(三) -- 使用SQL模型类
文章目录 Qt数据库操作(三) -- 使用SQL模型类 1.SQL查询模型 2.SQL表格模型 3.关系表格模型 Qt数据库操作(三) – 使用SQL模型类 Qt 提供了3个高级的类来访问数据库,分别 ...
- qt 数据库操作总结
整理一下 QT 操作数据库的一些要点,以备以后的查询学习(主要是操作 mysql ). 转载于:https://www.cnblogs.com/lsgxeva/p/7852102.html 首先,要查 ...
- Qt 数据库操作(一)
Qt 中的数据库操作比较简单,因为Qt提供了不需要SQL知识就可以浏览和编辑数据库的接口. Qt中的Qtsql模块提供了对数据库的支持,该模块中的众多类基本可以分为3层: 用户接口层: QSqlQue ...
- 详细的Qt数据库操作
#include QT += sql QSqlDatabase类实现了数据库连接的操作 QSqlQuery类用来执行SQL语句 QSqlRecord类 封装数据库所有记录 第一:QSqlDatabas ...
- 数据存储之 SQLite 数据库操作(二)
上一讲我们讲解了SQLite数据库的创建[数据存储之 SQLite 数据库操作(一)],还有更新的操作,这一讲我们来讲解一下数据库的增删改查,这边的程序是对上一个程序进行修改,建议结合上一讲内容进行学 ...
- java web 数据库操作_Java Web----Java Web的数据库操作(二)
Java Web的数据库操作 三.JDBC操作数据库 上一篇介绍了JDBC API,之后就可以通过API来操作数据库,实现对数据库的CRUD操作了. 下面仅以示例 的方式对数据库操作进行说明 1. 添 ...
- 数据存储之 SQLite 数据库操作(三)
上一讲中我们讲到了SQLite数据库的操作方法 [数据存储之SQLite数据库操作(二)],我们主要是以SQL语句对数据库进行增删改查,这一讲我们来学习一下 Android 建议的对数据库的操作方法 ...
- SAP ABAP openSQL数据库操作(四)
SAP ABAP openSQL数据库操作(一) SAP ABAP openSQL数据库操作(二) SAP ABAP openSQL数据库操作(三) 文章目录 5.数据的一致性 1.SAP LUW | ...
- 2.关于QT中数据库操作,简单数据库连接操作,数据库的增删改查,QSqlTableModel和QTableView,事务操作,关于QItemDelegate 代理
Linux下的qt安装,命令时:sudoapt-get install qt-sdk 安装mysql数据库,安装方法参考博客:http://blog.csdn.net/tototuzuoquan ...
最新文章
- 中国电信换将 三家运营商未来将如何争战
- JavaScript值得注意的小知识点
- Android之集成微信登录
- 第三届传智杯全国大学生IT技能大赛(决赛B组)【c++】
- android 9.0 https 适配,如何适配 Android 9.0? 在 Android 9.0 上发生 SSL handshake timed out 异常怎么解决...
- (117)FPGA面试题-使用三态缓冲器实现漏极开路缓冲
- AI产品经理需要了解的数据知识:余弦相似度
- 本地上传文件到FastDFS命令上传报错:ERROR - file: connection_pool.c, line: 142, connect to server 192.168.0.197:221
- 好消息:Dubbo Spring Boot要来了
- 无缝向上滚动文字代码(Js+div),可用在公告栏
- 为什么csrss进程有三个_什么是客户端服务器运行时进程(csrss.exe),为什么在我的PC上运行它?...
- 程序员垃圾简历长什么样?
- geogebra软件使用总结
- ARM嵌入式学习——多进程/线程
- 为什么我们不能坚持?
- 九度1088——剩下的树
- 启动服务提示端口已存在的处理方法
- 为Eclipse安装安卓开发插件ADT
- Windows7下PHP 7.1搭建开发环境
- Layui数据表格显示无数据提示问题
热门文章
- 多径信道理论的直观感受与MATLAB仿真
- [云炬创业学笔记]第一章创业是什么测试7
- [云炬创业管理笔记]第四章把握创业机会测试2
- [云炬创业基础笔记] 第四章测试8
- 云炬Android开发报错处理教程 解决Android Studio kotlin等依赖下载慢,下载超时失败的问题
- java中属于常量_java中的常量和属性
- C#操作SQLite数据库时出现“Insufficient parameters supplied to the command”的错误
- vs2010没有 最近使用的项目和解决方案
- BugkuCTF-Misc:多彩
- 构建知识图谱,让自己更值钱