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. Linux IIO子系统分析

    最近稍微看了下LKML,发现里面有一个子系统叫做“IIO”.以前没有接触过,所以Google了下.     IIO子系统全称是 Industrial I/O subsystem(工业 I/O 子系统) ...

  2. Yii常用技巧总结

    //YII framework路径 Yii::getFrameworkPath(); //protected/runtime Yii::app()->getRuntimePath(); //pr ...

  3. yii项目开发项目常用技巧和方法汇总

    1.使用CActiveForm类组件如何输出不带html属性的结果 eg:<?php echo $form->textField($model,'email',array('size'=& ...

  4. SqlCommand对象

    SqlCommand对象以及如何使用它与数据库交互 1.什么是command对象2.如何使用ExecuteReader方法查询数据3.如何使用ExecuteNonQuery方法插入和删除对象4.如何使 ...

  5. SUSE Linux实现局域网时间同步

    0.前言     需求是这么来的,搭建了Storm集群进行协同过滤算法的计算性能测试,要求精度在毫秒(ms)级别.局域网内40个虚拟机节点,用 date 命令,精度上和效率上都不可行.所以,就搭建了 ...

  6. java从mysql导出数据例子

    import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sq ...

  7. 一、两种方式初始化Mybatis

    一.xml Configuration.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTY ...

  8. mvc分层的原理

    首先这是现在最基本的分层方式,结合了SSH架构.1.modle层就是对应的数据库表的实体类.2.Dao层是使用了hibernate连接数据库.操作数据库(增删改查).3.Service层:引用对应的D ...

  9. jdk的动态代理

    至于jdk的动态代理怎么用此处并不多说,现在是更深一步的理解,jdk的Proxy类到底做了什么. Proxy.newProxyInstance可以生成代理类,此方法有三个参数(ClassLoader ...

  10. JavaBean以及MVC模式

    JavaBean,  咖啡豆. JavaBean是一种开发规范,可以说是一种技术. JavaBean就是一个普通的java类.只有符合以下规定才能称之为javabean: 1)必须提供无参数的构造方法 ...