在网上看见大家提到的方法是这样的:
if(QsqlDatabase::database().driver()->hasFeature(QsqlDriver::Transactions)) { //先判断该数据库是否支持事务操作 if(QsqlDatabase::database().transaction()) //启动事务操作 { //下面执行各种数据库操作 QsqlQuery query; query.exec("insert into student values (14,'hello')"); query.exec("delete from student where id = 1"); if(!QsqlDatabase::database().commit()) { qDebug() << QsqlDatabase::database().lastError(); //提交 if(!QsqlDatabase::database().rollback()) qDebug() << QsqlDatabase::database().lastError(); //回滚 } } }
我开始也觉得挺方便的,后来测试了一下(Qt4.8.4+Vs2008 + sqlServer2000)
执行两条exec语句,有一条为真,一条为假,但是commit都是真,一下达不到我的要求了,无赖之下只有采取迂回政策了,直接在exec方法中执行BEGIN TRAN,COMMIT TRAN,ROLLBACK TRAN这些语句。而每执行的一条其它sql语句,则记录是否成功,如果中间有一条失败,则调用ROLLBACK TRAN,否则最后执行COMMIT TRAN。
if (query.exec("BEGIN TRANSACTION LJT")) { bool execFlag1 = if (execFlag1&&) { if (!query.exec("COMMIT TRANSACTION LJT")) { qDebug()<<QObject::tr("COMMIT TRANSACTION出错,在文件")<<__FILE__<<QObject::tr("第")<<__LINE__<<QObject::tr("行"); } } else { if (!query.exec("ROLLBACK TRANSACTION LJT")) { qDebug()<<QObject::tr("ROLLBACK TRANSACTION出错,在文件")<<__FILE__<<QObject::tr("第")<<__LINE__<<QObject::tr("行"); } } } else { qDebug()<<QObject::tr("BEGIN TRANSACTION出错,在文件")<<__FILE__<<QObject::tr("第")<<__LINE__<<QObject::tr("行"); }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。