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语句的字段。这些要学习数据库知识。在此不做更多讲解。
这节主要是讲了数据库的连接,增删改查,统一增删改。一个业务的多处修改数据库一定要用上事务,统一完成或者统一取消。不能做一半一半错。那样对数据库是很危险的。
比如:你取钱的时候,取钱走了。数据库没减余额。那是多么可怕的事情。或者你存钱的时候,打印出来了成功的结果。但没加余额,那多么冤?是吧?