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

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

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

相关推荐
郑州光合科技余经理4 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo1234 天前
matlab画图工具
开发语言·matlab
dustcell.4 天前
haproxy七层代理
java·开发语言·前端
norlan_jame4 天前
C-PHY与D-PHY差异
c语言·开发语言
多恩Stone4 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
QQ4022054964 天前
Python+django+vue3预制菜半成品配菜平台
开发语言·python·django
遥遥江上月4 天前
Node.js + Stagehand + Python 部署
开发语言·python·node.js
m0_531237174 天前
C语言-数组练习进阶
c语言·开发语言·算法
Railshiqian4 天前
给android源码下的模拟器添加两个后排屏的修改
android·开发语言·javascript
雪人不是菜鸡4 天前
简单工厂模式
开发语言·算法·c#