sqlite3数据库支持事务

例如:

 BEGIN DEFERRED TRANSACTION;
INSERT INTO main.test_transaction (test_unique) VALUES ('test_6');
INSERT INTO main.test_transaction (test_unique) VALUES ('test_6');
COMMIT TRANSACTION;

第二个插入sql语句是不符合约束的,所以事务提交失败。

对比mysql,例如:

 SET autocommit = 0;
START TRANSACTION;
INSERT INTO `他天天天天`.test_2 (test_column,test_column2) VALUES ('', 'test2');
INSERT INTO `他天天天天`.test_2 (test_column,test_column2) VALUES ('', 'test3');
COMMIT;

同样,第二个插入sql语句是不符合约束的,所以事务提交失败。

但是到了qt里面使用sqlite3数据库时却发现了个问题:提交事务时,sql语句有正确的、错误的,但是提交都会成功,commit函数返回true。

请看测试代码:

 bool test__Qsql_transaction5()
{
bool is_success = false; do
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("dbName_test_transaction");
db.setHostName("AK-PC");
db.setUserName("Asterisk");
db.setPassword("");
//db.setPort(12345);
if (db.open("Asterisk", ""))
{
if (db.transaction())
{
QSqlQuery query; QString sql; sql = "CREATE TABLE IF NOT EXISTS test_transaction (tid INTEGER NOT NULL PRIMARY KEY ASC AUTOINCREMENT, param_1 VARCHAR(200));";
query.exec(sql);
qDebug() << query.lastError(); sql = "INSERT INTO test_transaction (tid,param_2) VALUES ('7','test2');";
bool b1 = query.exec(sql);
qDebug() << query.lastError(); sql = "INSERT INTO test_transaction (tid,param_2) VALUES ('8','test2');";
bool b2 = query.exec(sql);
qDebug() << query.lastError(); if ( !db.commit() )
{
qDebug() << db.lastError();
if ( !db.rollback() )
qDebug() << db.lastError();
}
}
}
db.close(); } while ( false ); return is_success;
}

同样,第二个插入sql语句是不符合约束的,所以事务提交失败。但是“db.commit()”返回true,不知道问题出在哪里。

完成测试代码:

 #include <QtCore/QCoreApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QString>
#include <QDebug>
#include <QSqlError>
#include <QSqlDriver> #include <iostream> bool test__Qsql_transaction()
{
bool is_success = false; do
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "connectionName_test_transaction");
db.setDatabaseName("dbName_test_transaction");
db.setHostName("AK-PC");
db.setUserName("Asterisk");
db.setPassword("");
//db.setPort(12345);
if (db.open("Asterisk", ""))
{
if (db.transaction())
{
QSqlQuery query(db); QString sql; sql = "CREATE TABLE IF NOT EXISTS test_transaction (tid INTEGER NOT NULL PRIMARY KEY ASC AUTOINCREMENT, param_1 VARCHAR(200));";
query.exec(sql);
qDebug() << query.lastError(); sql = "INSERT INTO test_transaction (tid,param_2) VALUES ('7','test2');";
bool b1 = query.exec(sql);
qDebug() << query.lastError(); sql = "INSERT INTO test_transaction (tid,param_2) VALUES ('8','test3');";
bool b2 = query.exec(sql);
qDebug() << query.lastError(); if ( !db.commit() )
{
qDebug() << db.lastError();
if ( !db.rollback() )
qDebug() << db.lastError();
}
}
}
db.close(); } while ( false ); return is_success;
}
bool test__Qsql_transaction2()
{
bool is_success = false; do
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "connectionName_test_transaction");
db.setDatabaseName("dbName_test_transaction");
db.setHostName("AK-PC");
db.setUserName("Asterisk");
db.setPassword("");
//db.setPort(12345);
if (db.open("Asterisk", ""))
{
QSqlQuery query0(db); QString sql;
bool b; sql = "CREATE TABLE IF NOT EXISTS test_transaction1 (tid INTEGER NOT NULL PRIMARY KEY ASC AUTOINCREMENT, param_1 VARCHAR(200), param_2 VARCHAR(80) NOT NULL UNIQUE);";
b = query0.exec(sql);
qDebug() << query0.lastError(); sql = "CREATE TABLE IF NOT EXISTS test_transaction2 (tid INTEGER NOT NULL PRIMARY KEY ASC AUTOINCREMENT, param_1 VARCHAR(200), param_2 VARCHAR(80) NOT NULL UNIQUE);";
b = query0.exec(sql);
qDebug() << query0.lastError(); bool bSupportTransaction = db.driver()->hasFeature(QSqlDriver::Transactions);
if (db.transaction())
{
QSqlQuery query(db); QString sql1, sql2, sql3, sql4, sql5;
bool b1, b2, b3, b4, b5;
QString qstrid = ""; sql2 = "INSERT OR REPLACE INTO test_transaction2 (tid, param_3, param_2) VALUES ('";
sql2 += qstrid;
sql2 += "','test_1','test_2');";
b2 = query.exec(sql2);
qDebug() << query.lastError(); sql5 = "DELETE FROM test_transaction1 WHERE tid = '";
sql5 += qstrid;
sql5 += "';";
b5 = query.exec(sql5);
qDebug() << query.lastError(); if ( !db.commit() )
{
db.rollback();
}
}
} } while ( false ); return is_success;
}
bool test__Qsql_transaction3()
{
bool is_success = false; do
{
bool bUse = QSqlDatabase::isDriverAvailable("QOCI");
QSqlDatabase db = QSqlDatabase::addDatabase("QOCI", "connectionName_test_transaction3");
db.setDatabaseName("dbName_test_transaction_by_oracle");
db.setHostName("AK-PC");
db.setUserName("Asterisk");
db.setPassword("");
//db.setPort(12345);
if (db.open("Asterisk", ""))
{
QSqlQuery query0(db); QString sql;
bool b; sql = "CREATE TABLE IF NOT EXISTS test_transaction1 (tid INTEGER NOT NULL PRIMARY KEY ASC AUTOINCREMENT, param_1 VARCHAR(200), param_2 VARCHAR(80) NOT NULL UNIQUE);";
b = query0.exec(sql);
qDebug() << query0.lastError(); sql = "CREATE TABLE IF NOT EXISTS test_transaction2 (tid INTEGER NOT NULL PRIMARY KEY ASC AUTOINCREMENT, param_1 VARCHAR(200), param_2 VARCHAR(80) NOT NULL UNIQUE);";
b = query0.exec(sql);
qDebug() << query0.lastError(); bool bSupportTransaction = db.driver()->hasFeature(QSqlDriver::Transactions);
if (db.transaction())
{
QSqlQuery query(db); QString sql1, sql2, sql3, sql4, sql5;
bool b1, b2, b3, b4, b5;
QString qstrid = ""; sql2 = "INSERT OR REPLACE INTO test_transaction2 (tid, param_3, param_2) VALUES ('";
sql2 += qstrid;
sql2 += "','test_1','test_2');";
b2 = query.exec(sql2);
qDebug() << query.lastError(); sql5 = "DELETE FROM test_transaction1 WHERE tid = '";
sql5 += qstrid;
sql5 += "';";
b5 = query.exec(sql5);
qDebug() << query.lastError(); if ( !db.commit() )
{
db.rollback();
}
}
} } while ( false ); return is_success;
}
bool test__Qsql_transaction4()
{
bool is_success = false; do
{
bool bUse = QSqlDatabase::isDriverAvailable("QMYSQL");
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
qDebug() << db.lastError(); db.setDatabaseName("dbName_test_transaction_by_mysql");
db.setHostName("AK-PC");
db.setUserName("Asterisk");
db.setPassword("");
//db.setPort(12345);
if (db.open("Asterisk", ""))
{
QSqlQuery query0(db); QString sql;
bool b; sql = "CREATE TABLE IF NOT EXISTS test_transaction1 (tid INTEGER NOT NULL PRIMARY KEY ASC AUTOINCREMENT, param_1 VARCHAR(200), param_2 VARCHAR(80) NOT NULL UNIQUE);";
b = query0.exec(sql);
qDebug() << query0.lastError(); sql = "CREATE TABLE IF NOT EXISTS test_transaction2 (tid INTEGER NOT NULL PRIMARY KEY ASC AUTOINCREMENT, param_1 VARCHAR(200), param_2 VARCHAR(80) NOT NULL UNIQUE);";
b = query0.exec(sql);
qDebug() << query0.lastError(); bool bSupportTransaction = db.driver()->hasFeature(QSqlDriver::Transactions);
if (db.transaction())
{
QSqlQuery query(db); QString sql1, sql2, sql3, sql4, sql5;
bool b1, b2, b3, b4, b5;
QString qstrid = ""; sql2 = "INSERT OR REPLACE INTO test_transaction2 (tid, param_3, param_2) VALUES ('";
sql2 += qstrid;
sql2 += "','test_1','test_2');";
b2 = query.exec(sql2);
qDebug() << query.lastError(); sql5 = "DELETE FROM test_transaction1 WHERE tid = '";
sql5 += qstrid;
sql5 += "';";
b5 = query.exec(sql5);
qDebug() << query.lastError(); if ( !db.commit() )
{
db.rollback();
}
}
} } while ( false ); return is_success;
}
bool test__Qsql_transaction5()
{
bool is_success = false; do
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("dbName_test_transaction");
db.setHostName("AK-PC");
db.setUserName("Asterisk");
db.setPassword("");
//db.setPort(12345);
if (db.open("Asterisk", ""))
{
if (db.transaction())
{
QSqlQuery query; QString sql; sql = "CREATE TABLE IF NOT EXISTS test_transaction (tid INTEGER NOT NULL PRIMARY KEY ASC AUTOINCREMENT, param_1 VARCHAR(200));";
query.exec(sql);
qDebug() << query.lastError(); sql = "INSERT INTO test_transaction (tid,param_2) VALUES ('7','test2');";
bool b1 = query.exec(sql);
qDebug() << query.lastError(); sql = "INSERT INTO test_transaction (tid,param_2) VALUES ('8','test2');";
bool b2 = query.exec(sql);
qDebug() << query.lastError(); if ( !db.commit() )
{
qDebug() << db.lastError();
if ( !db.rollback() )
qDebug() << db.lastError();
}
}
}
db.close(); } while ( false ); return is_success;
} int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); //std::cout << std::boolalpha << test__Qsql_transaction() << std::endl;
//std::cout << std::boolalpha << test__Qsql_transaction2() << std::endl;
//std::cout << std::boolalpha << test__Qsql_transaction3() << std::endl;
//std::cout << std::boolalpha << test__Qsql_transaction4() << std::endl;
std::cout << std::boolalpha << test__Qsql_transaction5() << std::endl; return a.exec();
}

*注:希望哪个高手能够帮我指出是我对qt操作sqlite有问题,还是qt对sqlite的操作就是这样的。万分感谢。

SQLITE和QT的更多相关文章

  1. 基于sqlite的Qt 数据库封装

    [代码] mydata.h 10 #ifndef MYDATA_H 11 #define MYDATA_H 12 #include <QObject> 13 #include <QS ...

  2. 在Qt中使用SQLite数据库

    前言 SQLite(sql)是一款开源轻量级的数据库软件,不需要server,可以集成在其他软件中,非常适合嵌入式系统. Qt5以上版本可以直接使用SQLite(Qt自带驱动). 用法 1 准备 引入 ...

  3. Qt 操作SQLite数据库

    项目中通常需要采用各种数据库(如 Qracle.SQL Server.MySQL等)来实现对数据的存储.查询等功能.下面讲解如何在 Qt 中操作 SQlite 数据库. 一.SQLite 介绍 Sql ...

  4. Qt——数据库编程

    一.概述 Qt提供了一个类似JDBC的数据库接口,需要为每个可以连接的特定数据库提供驱动程序,可以通过 QStringList QSqlDatabase::drivers() 知道当前版本的Qt哪些驱 ...

  5. Windows下OSGEarth的编译过程

    目录 1. 依赖 1) OpenSceneGraph 2) GDAL 3) CURL 4) GEOS 5) 其他 2. 编译 1) 设置参数 2) 配置路径 3) 生成编译 3. 参考文献 1. 依赖 ...

  6. Qt 程序访问 sqlite 权限错误

    在Linux桌面上开发应用,想要拥有root权限,可是又需要弹窗申请.所以尽量避免这种情况发生. 另外:gksu,pkexec可以提供gui的root权限索取功能. 因为db文件是安装的时候放到etc ...

  7. Qt Sqlite qwt 发布过程中碰到的问题runtime error

    qt版本:4.8.0 qwt版本:6.1.2 使用dll show检测缺少的dll,或者笨一点的方法,点击运行差什么找什么放进去: 左上显示exe调用哪些dll,右边是dll又再次调用啦哪些dll: ...

  8. Qt for Android 打包 SQLite 数据库

    Qt for Android 调用 SQLite 数据库时, 怎样将已经存在的数据库附加到 APK 中? 直接在你项目里面的Android源码的根目录下新建一个文件夹assets, 数据库就可以放里面 ...

  9. 单词游戏-基于SQLite+Qt的C++项目

    SQLite文件数据库的操作 Qt插件的安装配置 1.VS2008下安装Qt开发包 解压缩4.7.3.rar到C:\Qt\4.7.3\ Qt for VS addin2.安装并配置Visual Ass ...

随机推荐

  1. MySQL 数据库 引擎

    MySQL数 据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎,就必须重新编译MYSQL.在缺省情况下,MYSQL支持三个引 擎:ISAM.MYISAM和HEAP.另外两种类型I ...

  2. BZOJP1003 [ZJOI2006]物流运输trans

    BZOJP1003 [ZJOI2006]物流运输trans 1003: [ZJOI2006]物流运输trans Time Limit: 10 Sec  Memory Limit: 162 MB Sub ...

  3. vijosP1006 晴天小猪历险记之Hill

    vijosP1006 晴天小猪历险记之Hill 链接:https://vijos.org/p/1006 [思路] 图上DP. 这个题的递推顺序是关键.先从上一行得到最小值,然后从本行比较最小值,注意本 ...

  4. JavaScript高级程序设计31.pdf

    其它方面的变化 DOM的其他部分在“DOM2级核心”中也发生了一些变化,这些变化与XML命名空间无关,而是确保API的可靠性及完整性 DocumentType类型的变化 DocumentType类型新 ...

  5. zz android 系统 makefile文件(Android.mk)组织结构

    Android.mk脚本结构 下面是main.mk文件包含关系,本文档主要说明的就是这些文件里到底做了什么.(这个文件被根目录下的makefile文件包含) 一.     main.mk 1.检查版本 ...

  6. SSH架构

    说说项目架构整个变化过程吧 拿用户注册来举例: 数据库里面有一张User表 需要把注册信息存储到User表中 1.   最开始是两层架构 就是cliect   +  jsp    +   DB 就是在 ...

  7. [置顶] 第二届微软CRM交流年会

    第二届微软CRM交流会将在12月14日举行,亲们要是感兴趣可以查看下面的活动详情.Jeff也是第一次参加这类活动,作为本次活动的嘉宾我为大家带来一个挺有意思的分享主题<Dynamics CRM ...

  8. java 反射(reflect)总结,附对象打印工具类

    java反射机制认知 java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取类的信息以及动态调用对象的方法的 ...

  9. HibernateTemplate的find(String querystring)返回值具体解释

    项目源代码中出现例如以下代码: HibernateTemplate ht =-- List<Object[]> tempList = ht.find(String querystring) ...

  10. Decode Ways -- LeetCode

    原题链接: http://oj.leetcode.com/problems/decode-ways/  这道题要求解一个数字串依照字符串编码方式可解析方式的数量.看到这样的求数量的,我们非常easy想 ...