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语句的字段。这些要学习数据库知识。在此不做更多讲解。

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

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

相关推荐
Highcharts.js2 小时前
缺失数据可视化图表开发实战|Highcharts创建人员出生统计面积图表示例
开发语言·前端·javascript·信息可视化·highcharts·图表开发
测试员周周6 小时前
【Appium 系列】第16节-WebView-H5上下文切换 — 混合应用的自动化难点
运维·开发语言·人工智能·功能测试·appium·自动化·测试用例
杜子不疼.9 小时前
【C++ AI 大模型接入 SDK】 - DeepSeek 模型接入(上)
开发语言·c++·chatgpt
加号39 小时前
【C#】 串口通信技术深度解析及实现
开发语言·c#
sycmancia10 小时前
Qt——编辑交互功能的实现
开发语言·qt
石山代码10 小时前
C++ 内存分区 堆区
java·开发语言·c++
无风听海10 小时前
C# 隐式转换深度解析
java·开发语言·c#
一只大袋鼠11 小时前
Git 进阶(二):分支管理、暂存栈、远程仓库与多人协作
java·开发语言·git
LuminousCPP12 小时前
数据结构 - 线性表第四篇:C 语言通讯录优化升级全记录(踩坑 + 思考)
c语言·开发语言·数据结构·经验分享·笔记·学习
web3.088899912 小时前
1688 图搜接口(item_search_img / 拍立淘) 接入方法
开发语言·python