QT高阶日记5

QT高阶日记5

数据库操作

一个程序,一个软件,只要管理的数据量达到一定的数据,或者希望共享数据,那么数据库是一个首选的方案,一个数据库平台运行着数据,向外提供连接请求,查询请求,读写请求,从而实现将数据收纳、管理、吞吐的功能。

QT也不例外,为开发者提供了QSqlDatabase\QSqlQuery\QSqlRecord\QSqlField\QSqlQueryModel\QSqlError等几大功能类,用于操控数据库。

此篇将通过这几大类来讲解QT程序访问数据库的功能。

首先要用SQL得在pro文件里加入

QT +=...... sql

一、QSqlDatabase

该类像C#的SqlConnection功能。

同时用到了

QSqlDriver

QSqlError

QSql等类

用来添加、删除、复制、关闭数据库实例

该类包括方法主要有

close();//关闭连接的数据库

commit();

connectOptions();

connectionName();//连接名称

databaseName();//数据库

driver();//连接驱动

exec(QString &query);

hostName();//地址

状态判定

bool isOpen()

bool isOpenError();

bool isValid();

QSqlError lastError();//最后错误

重要方法

bool open();

bool open(QString &user,QString &password);

password();

int port();

QSqlIndex = primaryindex(QString &tableName);

QSqlRecord record();

bool roolback();

设置方法

setConnectOptions(QString options);

setDatabaseName(QString name);

setHostName(QString host);

setNumericalPercisionPollcy(QSql::NumericalPrecisionPollcy pp);

setPassword(QString pw);

setPort(int port);

setUserName(QString uname);

QStringList tables(QSql::TableType type=QSql::tables);

bool transction();

QString userName();

另静态方法

addDatabase();

cloneDatabase();

connectionNames();

contains();

database();

drivers();

isDriverAvailable();

registerSqlDriver();

removeDatabase();

可重写方法

QSqlDatabase(QSqlDriver * drv);

QSqlDatabase(QString &type);

代码示例:

引用#include<QSqlError>

#include<QSqlDatabase>

//驱动列表

QStringList drivers = QSqlDatabase::drivers();

//驱动列表内容大致如下:

//("QSQLITE","QODBC","QODBC3","QPSQL","QPSQL7","QMYSQL","QMYSQL3",......)

//用静态方法创建一个访问数据库的实例

QSqlDatabase db=QSqlDatabase :: addDatabase("QMYSQL");

db.setDatabaseName("数据库名称");

db.setHostName("localhost")//或者IP埴//127.0.0.1或者本地IP地址或者远程IP地址

db.setUserName("root");

db.setPassword("password");

db.setPort(3306);//MySql:3306,MSSQL:1433,Oracle:1521默认端口

//连接数据库

if(!db.open())

{

QSqlError er=db.lastError();//如果连接失败,取最后错误出来看看er.text()/er.type()/er.databaseText()/er.driverText()等得到错误相关的内容

qDebug() << er.text();//输出错误信息

}

else

{

qDebug() << "连接成功!"

}

//下面将他用db来示例后面的功能。

二、QSqlQuery

数据库查询、添加、修改、删除等操作

QSqlQuery query= new QSqlQuery(QString sql,QSqlDatabase db);

//如果构造时不指定sql,可以用query.exec(QString sql)指定sql语句

bool next()==false表示空数据集或者走到了最后了结束了

first()/last()/next(),得到一行记录,它有多个字段

//将它得到QVariant =query[0...n]字段表。

或者是QVariant =value("字段名")得到一个字段当前内容。

QVariant 封装了数据类型统一化。通过它的toXXX()方法得到具体的类型

QSqlQuery的其他方法

isNull(int字段序号);

isNull(QString字段名);

还有一个重要的方法得到QSqlRecord

size()//得到记记录量

seek(int Index);//定位记录行

record();//得到记录集

程序示例:引用上面的db当数据库连接器

QSqlQuery query;

QString sql="Select * from mysql";

query.exec(sql);

while(query.next())

{

qDebug() <<query.value(0).toUint();

qDebug() <<query.value("sex").toString();

//从而得到当前行的所有字段的内容。

}

读完以后。

用完数据库以后

db.close()

三、QSqlRecord

数据库记录

四、QSqlField

数据表字段

五、QSqlQueryModel

数据库查询高接口,包括数据表,数据过程,View类,等操作。

六、QSqlError

数据库操作失败可以通过这个类获取相关的错误信息

text();

type();是最主要用的

七、数据库事务处理

1、创建事务

bool QSqlDatabase::transaction();

2、提交事务

bool QSqlDatabase::commit();

3、回滚事务

bool QSqlDatabase::rollback();

事务主要是进行insert/update/delete等操作要进行事务管理,统一干活,要么全干,要么全不干。

特别是一次要更改多个表的时候。特别有用。

示例:

bool isok=true;

db.transaction();//创建事务

isok &=query.exec("insert/update/delete语句1");

isok&=query.exec("insert/update/delete语句2");

isok&=query.exec("insert/update/delete语句3");

这三条语句是一个业务要求修改的三个地方的内容。不能漏谁。要么全执行成功,要么全不执行。因而使用了事务管理

if(isok )

{

db.commit();//全成功就提交事务

}

else

{

db.rollback();//只要有其中一条失败就回滚事务,相当于上面的三条语句都取消

}

//完了

db.close();

有关SQL语句的组装,或者更高级的自动从类字段组装SQL语句的字段。这些要学习数据库知识。在此不做更多讲解。

这节主要是讲了数据库的连接,增删改查,统一增删改。一个业务的多处修改数据库一定要用上事务,统一完成或者统一取消。不能做一半一半错。那样对数据库是很危险的。

比如:你取钱的时候,取钱走了。数据库没减余额。那是多么可怕的事情。或者你存钱的时候,打印出来了成功的结果。但没加余额,那多么冤?是吧?

相关推荐
猫头虎8 分钟前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
YUJIANYUE28 分钟前
PHP纹路验证码
开发语言·php
仟濹40 分钟前
【Java基础】多态 | 打卡day2
java·开发语言
孞㐑¥40 分钟前
算法——BFS
开发语言·c++·经验分享·笔记·算法
Re.不晚40 分钟前
JAVA进阶之路——无奖问答挑战2
java·开发语言
八零后琐话43 分钟前
干货:程序员必备性能分析工具——Arthas火焰图
开发语言·python
3GPP仿真实验室1 小时前
【MATLAB源码】CORDIC-QR :基于Cordic硬件级矩阵QR分解
开发语言·matlab·矩阵
知南x1 小时前
【Ascend C系列课程(高级)】(1) 算子调试+调优
c语言·开发语言
忆~遂愿1 小时前
GE 引擎与算子版本控制:确保前向兼容性与图重写策略的稳定性
大数据·开发语言·docker
Ro Jace2 小时前
计算机专业基础教材
java·开发语言