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

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();      //回滚  返回false
     return 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();
    //打印事务开启结果 bool
    qDebug()  << " 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---------------------" ;

谢谢~~~

猜你喜欢

转载自blog.csdn.net/qq_45646951/article/details/109051341
今日推荐