QT SQL使用指南
QT SQL使用指南
QtSql模块提供了与平台无关的访问SQL数据库的接口,这个接口由利用Qt的模型/视图机构将数据库与用户界面集成的一套类来支持。
- QSqlDatabase对象表征了数据库的关联。
- QSqlQuery类提供了一种直接执行任意的SQL语句并处理其结果的方式。
- QSqlTableModel和QSqlRelationalTableModel可以用来遍历和编辑数据,也可以添加用户可以查看和修改的视图。
1. 链接数据库
QSqlDatabase *QSqlDatabase::addDatabase
( const QString & type,const QString & connectionName= defaultConnection ) [static]
Adds a database to the list of
database connections usingthe drivertype and the connection nameconnectionName.
调用QSqlDatabase的静态函数addDatabase()创建一个QSqlDatabase对象,指定数据库驱动类型和链接名称,链接名称不指定则设为默认链接,直到程序关闭或者调removeDatabase()函数,才关闭该链接。调用setDatabaseName()函数创建数据库文件。
QSqlDatabase db = QSqlDatabase::addDatabase(databasename);
db.setDatabaseName(databasefilename);
打开数据库:
bool db.open();
查看QT支持数据库类型:
QStringListdrivers=QSqlDatabase::drivers();
qDebug()<<drivers;
验证是否支持SQLite:
if(!QSqlDatabase::drivers().contains("QSQLITE"))
{
QMessageBox::critical(0, QString("数据库警告"), QString("没有驱动SQLITE"),QMessageBox::Cancel, QMessageBox::NoButton);
}
查看数据库文件里有哪些表,是否含有一张表:
QStringListtables=db.tables();
qDebug()<<tables;
if(!tables.contains("numsetdatabase"))
2. 查询数据库
QSqlQuery类提供了一种执行和操纵SQL语句的方式。
QSqlQuery包括了所有的功能,像在一个QSqlDatabase上执行SQL查询创建、导航和索取数据等等。它可以执行DML(数据操作语言)语句,比如SELECT, INSERT, UPDATE 和 DELETE, 还可以执行DDL(数据定义语言)语句,比如:CREATE TABLE。不仅如此,它还可以用于执行特定数据库而不是标准SQL语句的指令(比如 SET DATESTYLE=ISO 用于 PostgreSQL).
成功执行一SQL语句设置query为活动状态( isActive() 返回TRUE)否则查询置为非活动状态。无论那种情况,执行一条新的 SQL 语句之后,查询都被定位在一个无效的记录上;所以在数据被获取之前,查询都必须被导航到一个有效的记录上(isValid()可以确定查询是否处在一个有效的记录上)。
在记录之间进行导航用以下一条函数:
next()
prev()
first()
last()
seek(int)
这些函数允许程序员向前、向后或随心所欲地在查询返回的记录之间移动。一旦一个处于活动状态的查询被定位在一个有效的记录上时,就可以通过value()获取数据。所有的数据都被用QVariants从SQL后端转换过来。比如:
QSqlQuery query( "select name from customer" );
while ( query.next() ) {
QString name = query.value(0).toString();
doSomething( name );
}
要获得从一个查询中返回的数据,用value()方法。由SELECT语句返回的数据中的每个域可以通过指定一个索引来访问,索引从0开始。没有一个方法可以通过指定名字来定位域的,因为这不能得到可能确认。(请看QSqlCursor,它提供一个更加有弹性的接口用于从一个表单中选择数据或在一个数据库中查看数据)。
1. 把SQL查询指定为QSqlQuery::exec()的参数,也可以把它传递给构造函数,构造函数或立即执行。
QSqlQuery query; query.exec("createtablenumsetdatabase(idintprimarykey,numint)");
QSqlQuery query("createtablenumsetdatabase(idintprimarykey,numint)");
2. 如果需要插入多条记录或者不想将数值转换为字符串,可以使用prepare()
bool QSqlQuery::prepare (const QString & query )
query.prepare("INSERT INTO person (id,forename, surname) "
"VALUES (:id, :forename,:surname)");
query.bindValue(":forename","Bart");
query.bindValue(":surname","Simpson");
query.prepare("INSERT INTO person(id, forename, surname) "
query.addbindValue("Simpson");
QSqlDatabase db =QSqlDatabase::addDatabase(“database1”, “database2”);
db.setDatabaseName(“databasefile”);
QSqlDatabase db = QSqlDatabase::database(“database1”);
将该数据库对象指针db传递到QSqlQuery的构造函数,使用该链接:
QSqlQuery query("createtablenumsetdatabase(idintprimarykey,numint)");
(2)在操作一个大数据库时,为了便于优化,可以在调用exec()前调用QSqlQuery::setForwardOnly(true),然后使用next()遍历查询结果。
QSqlDatabase::database().transaction();
host_number_query.setForwardOnly(true);
host_number_query.exec("selectnumfromnumsetdatabase");
while(host_number_query.next())
host=host_number_query.value(0).toInt();
QSqlDatabase::database().commit();
3. SQL事务处理
默认情况下,SQLite的每一条exec()语句就是一个事务。在数据库访问、修改的并发性和频率较高时,为了达到数据同步的需要,防止在修改数据库数据的同时有其他操作发生导致数据不一致,最好采用事务处理。
bool QSqlDatabase::transaction ()
bool QSqlDatabase::rollback ()
#include <QtCore/QCoreApplication>
int main(int argc, char *argv[])
QCoreApplication a(argc, argv);
QSqlDatabase db_sqlite = QSqlDatabase::addDatabase("QSQLITE", "connSQLite");
db_sqlite.setDatabaseName("SQLiteDB.db3");
QSqlQueryquery("", db_sqlite);
bsuccess = query.exec("insert into DataBase(D_1,D_2,D_3,D_4,D_5) values('TT','TT','TT','TT','TT')");
// 提交事务,这个时候才是真正打开文件执行SQL语句的时候
cout<<"10000条数据耗时:"<<tmpTime.elapsed()<<"ms"<<endl;
QT SQL使用指南相关推荐
- sql 拆分_技术分享 | 基于分布式中间件的SQL改造指南
原创作者: 孙正方 4月12日,GOPS全球运维大会在深圳隆重召开,全球运维大会是国内第一个运维行业大会,爱可开源社区在基础架构及DevOps解决方案专场分享了<基于分布式中间件的SQL改造指南 ...
- Qt Assistant快速指南
Qt Assistant快速指南 Qt Assistant快速指南 管理书签 搜索关键词 使用自由文本搜索 Qt Assistant快速指南 一旦安装了Qt,就可以像开发主机上的任何其他应用程序一样启 ...
- qt oracle bindvalue,Qt Sql bindValue与%
本站所有文章由本站和原作者保留一切权力,仅在保留本版权信息.原文链接.原文作者的情况下允许转载,转载请勿删改原文内容, 并不得用于商业用途. 谢谢合作. 原文链接:Qt Sql bindValue与% ...
- 《SQL初学者指南(第2版)》——2.4 指定列
本节书摘来自异步社区出版社<SQL初学者指南(第2版)>一书中的第2章,第2.4节,作者:[美]Larry Rockoff,更多章节内容可以访问云栖社区"异步社区"公众 ...
- duration转为时间戳_Flink Table APIamp;SQL编程指南之时间属性(3)
Flink总共有三种时间语义:Processing time(处理时间).Event time(事件时间)以及Ingestion time(摄入时间).关于这些时间语义的具体解释,可以参考另一篇文章F ...
- sql学习指南_SQL格式功能的全面指南
sql学习指南 This article explains the usage of SQL Format function and performance comparison with SQL C ...
- sql初学者指南_初学者SQL示例:SQL SELECT语句的用法
sql初学者指南 SQLSELECT statements are used to retrieve data from the database and also, they populate th ...
- sql初学者指南_使用tSQLt框架SQL单元测试面向初学者
sql初学者指南 tSQLt is a powerful, open source framework for SQL Server unit testing. In this article, we ...
- Qt 5入门指南之Qt Quick编程示例
Qt 5入门指南之Qt Quick编程示例 使用Qt创建应用程序是十分简单的.考虑到你的使用习惯,我们编写了两套教程来实现两个相似的应用程序,但是使用了 不同的方法.在开始之前,请确保你已经下载了Qt ...
最新文章
- 60条令你大吃一惊的小常识,很有用
- 5G UE — USIM Card — 5G 的 USIM 卡
- invalid argument 0: Sizes of tensors must match except in dimension 0. Got 1
- IPC进程间通信 D-Bus(Desktop Bus)快速入门(以libdbus-glib库为例)
- 编程实现算术表达式求值_用魔法打败魔法:C++模板元编程实现的scheme元循环求值器...
- 学习Linux的一些建议
- Vector的简单使用
- I春秋第四季CTF-Web-Writeup(部分)
- awk获取+sed替换+paste命令追加一列
- jQuery:表格的奇偶行变色,jquery实例之表格隔一行
- 网络名称 转换 网络地址_网络地址转换| 计算机网络
- Nacos高可用集群解决方案-Docker版本
- Java拦截器限制IP访问次数
- 浅谈互联网那些防不胜防的人肉搜索技巧
- 在虚拟机、Mac 电脑和旧电脑上绕过 TPM 安装 Windows 11 的方法总结(提供通用无 TPM 检测镜像下载)
- Netpod Alive网络拓扑图生成、绘制有生命的网络拓扑图工具
- 如何学习Photoshop
- 42条微信营销小技巧!
- python爬虫安装教程_环境安装-Python 原生爬虫教程 | IT大叔
- 电动车锂电池行业前景广阔,啰马锂服帮助企业、门店“降本增效”