QT QSqlite数据库事务的使用以及注意事项
- QSqlite 的事务(transaction)
-
- 事务:对数据库的操作要么全部执行,要么全部不执行;
-
- 1.判断自己的数据库是否有事务功能:
- 2.如果为true,可以使用开启:
- sql语句的执行
- 以上都是正常操作
- 原因:
- 谢谢~~~
QSqlite 的事务(transaction)
事务:对数据库的操作要么全部执行,要么全部不执行;
1.判断自己的数据库是否有事务功能:
在数据库连接成功后,打印以下:结果 true | false
qDebug() <<"this DB hasFeature:Transaction:" <<db.driver()->hasFeature(QSqlDriver::Transactions);
2.如果为true,可以使用开启:
这里的返回值也是bool类型 可以打印看看结果 true | false
bool transaction_begin;
transaction_begin= db.transaction(); //开启事务
//打印事务开启结果 bool
qDebug() << " transaction_begin : "<<transaction_begin ;
sql语句的执行
一般操作就是增删改的基础上进行实物,查就没必要了
query.prepare(QString("INSERT INTO TANLE_NAME("........")");
做了以上插入之后,就可以提交了,当然,如果存储过程有错误,需要回滚rollback(); 无错再commite;
然后查看打印结果
bool success = query.exec();
query.finish(); //资源释放
QSqlError lastError = query.lastError(); //错误信息
if(!success)
{
qDebug() << QObject::tr("TANLE add %1 tr lose: ").arg(i) << lastError;db.rollback(); //回滚 返回falsereturn false;
}
else
{
qDebug() << QObject::tr("TEST_RESULT add %1 tr success").arg(i);
}
commit_result = db.commit(); //提交事务
qDebug() << "commit_result---------- : " << commit_result;
db.close();
db.removeDatabase(nmDatabase);
以上都是正常操作
以上的操作知识一次操作,如果是需要多次存储,如果是有规律的 ,允许for循环的 ,直接在sql语句添加for循环即可,但是如果是需要隔类操作(数据库是一个单独的类,在其它类中创建了这个数据库的类,然后要调用这里的insert()函数,并且还是循环调用这里的insert()函数。),就不能实现事务的处理了。
看下代码:循环调用
while (iter != Trss.end()) //用while循环 如果不是结尾就一直添加 并且递增
{
userDB->addOneTR(iter.value());iter ++;
}
addOneTR() 添加如下:
for(i = 0;i<TRS.size();i++)
{
query.prepare(QString("INSERT INTO TANLE_NAME("........")");
}
以上的 双重循环添加, 在调试中中断就会出现数据存储一般的情况,并且是打印结果为false。
原因:
经过排查,原因是:①数据库的连接应该在事务开启前连接;②数据库的关闭,断开连接,应该在commit之后断开。
但是这里的数据库类是额外的,所以我这边是同时调用数据库类的方法,userDB是我的数据库类指针。
//创建连接userDB->createConnection2(userDB->nmDatabase);//查看是否允许事务的使用qDebug() <<"this DB hasFeature:Transaction:" <<userDB->db.driver()->hasFeature(QSqlDriver::Transactions);//开启事务transaction_begin = userDB->db.transaction();//打印事务开启结果 boolqDebug() << " transaction_begin : "<<transaction_begin ;QMap<int, QVector<TEST_RESULT>>::iterator iter = Trss.begin(); //创建迭代器 是测试结果的第一个值qDebug() << " Begin insert One Wpnl PCB Result---------------------" ;while (iter != Trss.end()) //用while循环 如果不是结尾就一直添加 并且递增{
userDB->addOneTR(iter.value());iter ++;}//commit提交事务commit_result = userDB->db.commit();//打印提交结果qDebug() << " commit_result : "<<commit_result ;//关闭数据库userDB->db.close();//移除连接userDB->db.removeDatabase(userDB->nmDatabase);qDebug() << Trss.value(0).at(0).barcode << " End insert One Wpnl PCB Result---------------------" ;