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

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

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

相关推荐
froginwe112 小时前
Swift 数组
开发语言
Elnaij2 小时前
从C++开始的编程生活(17)——多态
开发语言·c++
无心水2 小时前
1、Go语言工作区和GOPATH实战指南:从项目初始化到部署
开发语言·后端·架构·golang·go·gopath·go mod init
少控科技2 小时前
QT高阶日记008
开发语言·qt
阿蒙Amon2 小时前
C#每日面试题-Task和ValueTask区别
java·开发语言·c#
Frank_refuel2 小时前
C++之多态详解
开发语言·c++
TDengine (老段)2 小时前
TDengine R 语言连接器进阶指南
大数据·开发语言·数据库·r语言·时序数据库·tdengine·涛思数据
FAFU_kyp2 小时前
Rust 泛型(Generics)学习教程
开发语言·学习·rust
VekiSon2 小时前
ARM架构——C 语言+SDK+BSP 实现 LED 点灯与蜂鸣器驱动
c语言·开发语言·arm开发·嵌入式硬件