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. JavaScript高级程序设计24.pdf

    Element类型 Element类型用于表现XML或HTML元素,提供对元素标签名.子节点及特性的访问,它具有以下特征 nodeType的值为1: nodeName的值为元素的标签名: nodeVa ...

  2. 一步一步写一个简单通用的makefile(一)

    经常会用写一些小的程序有的是作为测试,但是每次都需要写一些简单的GCC 命令,有的时候移植一些项目中的部分代码到小程序里面进行测试,这个时候GCC 命令并不好些,如果写啦一个比较常用的makefile ...

  3. Linux,实时获取磁盘空间

    #include <iostream> #include <stdlib.h> #include <stdio.h> #include <sys/statfs ...

  4. Eclipse编译ijkplayer

    参考链接:http://blog.csdn.net/fatiao101/article/details/49586379

  5. 1 weekend110的NN元数据管理机制 + NN工作机制 + DN工作原理

    第一天的笔记,是伪分布hadoop集群搭建, 后面是hadoop Ha的分布式集群搭建 第一天,是HDFS的shell操作 NN工作机制 里面是二进制 DN工作原理 上传完了之后,在hdfs的虚拟路径 ...

  6. hadoop的安装

    1. 获取linux操作系统 可以申请云主机. 2. 安装JDK,配置环境变量 sudo apt-get install openjdk-7-jdk vim /etc/profile 在配置文件中配置 ...

  7. 【python自动化第四篇:python入门进阶】

    今天的课程总结: 装饰器 迭代器&生成器 json&pickle实现数据的序列化 软件目录结构规范 一.装饰器 装饰器的本质是函数,起目的就是用来为其它函数增加附加功能 原则:不能修改 ...

  8. 第一个Xcode项目 - 代码修改布局约束

    第一行的选中效果已经有了,那第二行的选中效果怎么做呢?我这里选择改变布局约束来实现选中效果 [我有个用object-c做APP的同事他说,我觉得这个应该去获取色块的位置,然后赋给选中用的View,然后 ...

  9. Linux性能及调优指南(翻译)

    http://blog.csdn.net/ljianhui/article/details/46718835 http://blog.chinaunix.net/uid-26000296-id-406 ...

  10. WCF - 消息

    SOAP SOAP是Simple Object Access Protocol(简单对象访问协议)的简称 而如今SOAP已经成为了符合W3C制定的SOAP规范的消息 允许您使用 XML 在通过低层 I ...