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

本文详细介绍了如何在QTQSqlite中使用事务进行数据操作,包括检查数据库事务功能、开启和提交事务、错误处理及回滚操作。强调了在事务处理中数据库连接应在事务开始前建立,关闭应在提交后进行,以确保数据一致性。同时,讨论了在循环调用事务处理时可能遇到的问题及解决方案。
摘要由CSDN通过智能技术生成

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

谢谢~~~

Qt 使用 QSQLite 连接和操作 SQLite 数据库非常方便。下面是一个简单的示例代码,演示如何在 Qt使用 QSQLite: 首先,确保已经在 Qt 项目中添加了 SQLite 驱动程序。在项目的.pro 文件中添加以下行: ```plaintext QT += sql ``` 然后,在需要使用 QSQLite 的源文件中,包含以下头文件: ```cpp #include <QSqlDatabase> #include <QSqlQuery> #include <QSqlError> ``` 接下来,可以使用以下代码连接到 SQLite 数据库: ```cpp QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("path/to/your/database/file.db"); if (!db.open()) { qDebug() << "Failed to connect to database:" << db.lastError().text(); return; } ``` 在上面的代码中,将 "path/to/your/database/file.db" 替换为实际的数据库文件路径。如果数据库连接成功,可以执行数据库操作。 例如,可以执行 SQL 查询语句: ```cpp QSqlQuery query; if (!query.exec("SELECT * FROM your_table")) { qDebug() << "Failed to execute query:" << query.lastError().text(); return; } while (query.next()) { // 处理查询结果 QString column1 = query.value(0).toString(); int column2 = query.value(1).toInt(); // ... } ``` 以上代码将执行一个简单的 SELECT 查询,并遍历结果。 当完成所有数据库操作后,可以关闭数据库连接: ```cpp db.close(); ``` 这是一个简单的使用 QSQLite 的示例。根据具体需求,可以进行更多的数据库操作,例如插入、更新和删除数据等。详细的 Qt SQL 文档可以在 Qt 官方网站上找到。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光顶术士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值