当前位置: 代码迷 >> 综合 >> QT数据库的使用(QSQLITE)(四 事务的使用以及注意事项 )
  详细解决方案

QT数据库的使用(QSQLITE)(四 事务的使用以及注意事项 )

热度:41   发布时间:2024-02-28 00:21:04.0

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---------------------" ;

谢谢~~~

  相关解决方案