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

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

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

相关推荐
用户805533698034 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner4 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz9 天前
QML Hello World 入门示例
qt
xcyxiner12 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner13 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner13 天前
DicomViewer (添加模型类)3
qt
xcyxiner14 天前
DicomViewer (目录调整) 2
qt
xcyxiner14 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00616 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术16 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript