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. Oracle 行拼接 wmsys.wm_concat扩展

    将多行数据拼接成一行: --wmsys.wm_concat group by a.flowid; 但有大小限制:字符串缓冲区太小,超过varchar 4000长度.扩展:更改返回类型为clob --T ...

  2. 2D游戏编程2--windows高级编程

      windows应用程序布局 编译流程 响应菜单事件消息 菜单消息处理实例: LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wpar ...

  3. Bzoj 4196: [Noi2015]软件包管理器 树链剖分

    4196: [Noi2015]软件包管理器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 721  Solved: 419[Submit][Statu ...

  4. (转载)WindowsXP上安装和运行神器SqlMap的步骤

    在Windows XP上安装和运行SqlMap的步骤…… 1.首先下载SqlMap 点击下载. https://codeload.github.com/sqlmapproject/sqlmap/leg ...

  5. Classical Inheritance in JavaScript

    JavaScript is a class-free, object-oriented language, and as such, it uses prototypal inheritance in ...

  6. 在C#中如何确定一个文件是不是文本文件,以及如何确定一个文件的类型

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:在C#中如何确定一个文件是不是文本文件,以及如何确定一个文件的类型.

  7. PHP判断变量是否为长整形的方法

    PHP判断变量是否为长整形的方法,可用于判断QQ号等,避免了int溢出的问题 <?php /** * 判断变量是否为长整数(int与整数float) * @param mixed $var * ...

  8. 基于前端javascript的搜索功能

    发表于 2013/11/07 当在数据量不是很大,而且没有后端对应的功能接口的时候,一些简单的搜索功能基本上是前端去实现的,正好最近用到,写了一个,贴出来和大家分享: 功能描述: 按下键盘后及时搜索条 ...

  9. Eclipse快捷键调试

    Eclipse中有如下一些和运行调试相关的快捷键Ctrl+Shift+B:在当前行设置断点或取消设置的断点  F11:调试最后一次执行的程序    Ctrl+F11:运行最后一次执行的程序F5:跟踪到 ...

  10. [TypeScript] Using Typings and Loading From node_modules

    Using TypeScript when installing packages from npm often requires you to install related definition ...