SQLITE3 使用总结

SQLITE3 使用总结

                   董淳光 42530 (老工号)

 dcg1981@163.com

                     2007611星期一

 

 

前序:

一、       版本

二、       基本编译

三、       SQLITE操作入门

1     基本流程

2     SQL语句操作

3     操作二进制

4     事务处理

四、       给数据库加密

五、       后记

 

 

前序:

Sqlite3 的确很好用。小巧、速度快。但是因为非微软的产品,帮助文档总觉得不够。这些天再次研究它,又有一些收获,这里把我对 sqlite3 的研究列出来,以备忘记。

这里要注明,我是一个跨平台专注者,并不喜欢只用 windows 平台。我以前的工作就是为 unix 平台写代码。下面我所写的东西,虽然没有验证,但是我已尽量不使用任何 windows 的东西,只使用标准 C 或标准C++。但是,我没有尝试过在别的系统、别的编译器下编译,因此下面的叙述如果不正确,则留待以后修改。

下面我的代码仍然用 VC 编写,因为我觉得VC是一个很不错的IDE,可以加快代码编写速度(例如配合 Vassist )。下面我所说的编译环境,是VC2003。如果读者觉得自己习惯于 unix 下用 vi 编写代码速度较快,可以不用管我的说明,只需要符合自己习惯即可,因为我用的是标准 C  C++。不会给任何人带来不便。

 

一、       版本

从 www.sqlite.org 网站可下载到最新的 sqlite 代码和编译版本。我写此文章时,最新代码是 3.3.17 版本。

很久没有去下载 sqlite 新代码,因此也不知道 sqlite 变化这么大。以前很多文件,现在全部合并成一个 sqlite3.c 文件。如果单独用此文件,是挺好的,省去拷贝一堆文件还担心有没有遗漏。但是也带来一个问题:此文件太大,快接近7万行代码,VC开它整个机器都慢下来了。如果不需要改它代码,也就不需要打开 sqlite3.c 文件,机器不会慢。但是,下面我要写通过修改 sqlite 代码完成加密功能,那时候就比较痛苦了。如果个人水平较高,建议用些简单的编辑器来编辑,例如 UltraEdit  Notepad 。速度会快很多。

 

二、       基本编译

这个不想多说了,在 VC 里新建 dos 控制台空白工程,把 sqlite3.c sqlite3.h 添加到工程,再新建一个 main.cpp 文件。在里面写:

extern "C"

{

#include "./sqlite3.h"

};

int main( int , char** )

{

return 0;

}

为什么要 extern “C” ?如果问这个问题,我不想说太多,这是C++的基础。要在 C++ 里使用一段 C 的代码,必须要用 extern “C” 括起来。C++ C虽然语法上有重叠,但是它们是两个不同的东西,内存里的布局是完全不同的,在C++编译器里不用extern “C”括起C代码,会导致编译器不知道该如何为 C 代码描述内存布局。

可能在 sqlite3.c 里人家已经把整段代码都 extern “C” 括起来了,但是你遇到一个 .c 文件就自觉的再括一次,也没什么不好。

基本工程就这样建立起来了。编译,可以通过。但是有一堆的warning。可以不管它。

 

三、       SQLITE操作入门

sqlite提供的是一些C函数接口,你可以用这些函数操作数据库。通过使用这些接口,传递一些标准 sql 语句(以 char * 类型)给 sqlite 函数,sqlite 就会为你操作数据库。

sqlite MSaccess一样是文件型数据库,就是说,一个数据库就是一个文件,此数据库里可以建立很多的表,可以建立索引、触发器等等,但是,它实际上得到的就是一个文件。备份这个文件就备份了整个数据库。

sqlite 不需要任何数据库引擎,这意味着如果你需要 sqlite 来保存一些用户数据,甚至都不需要安装数据库(如果你做个小软件还要求人家必须装了sqlserver 才能运行,那也太黑心了)

下面开始介绍数据库基本操作。

(1)   基本流程

i.1            关键数据结构

sqlite 里最常用到的是 sqlite3 * 类型。从数据库打开开始,sqlite就要为这个类型准备好内存,直到数据库关闭,整个过程都需要用到这个类型。当数据库打开时开始,这个类型的变量就代表了你要操作的数据库。下面再详细介绍。

i.2            打开数据库

int sqlite3_open( 文件名, sqlite3 ** );

用这个函数开始数据库操作。

需要传入两个参数,一是数据库文件名,比如:c://DongChunGuang_Database.db

文件名不需要一定存在,如果此文件不存在,sqlite 会自动建立它。如果它存在,就尝试把它当数据库文件来打开。

sqlite3 ** 参数即前面提到的关键数据结构。这个结构底层细节如何,你不要关它。

函数返回值表示操作是否正确,如果是 SQLITE_OK 则表示操作正常。相关的返回值sqlite定义了一些宏。具体这些宏的含义可以参考sqlite3.h 文件。里面有详细定义(顺便说一下,sqlite3 的代码注释率自称是非常高的,实际上也的确很高。只要你会看英文,sqlite 可以让你学到不少东西)。

下面介绍关闭数据库后,再给一段参考代码。

i.3            关闭数据库

int sqlite3_close(sqlite3 *);

       前面如果用 sqlite3_open 开启了一个数据库,结尾时不要忘了用这个函数关闭数据库。

下面给段简单的代码:

extern "C"

{

#include "./sqlite3.h"

};

int main( int , char** )

{

    sqlite3 * db = NULL; //声明sqlite关键结构指针

    int result;

 

//打开数据库

//需要传入 db 这个指针的指针,因为 sqlite3_open 函数要为这个指针分配内存,还要让db指针指向这个内存区

    result = sqlite3_open( c://Dcg_database.db, &db );

    if( result != SQLITE_OK )

    {

     //数据库打开失败

return -1;

}

//数据库操作代码

//

 

//数据库打开成功

//关闭数据库

sqlite3_close( db );

return 0;

}

这就是一次数据库操作过程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本次更新对于支持库来说,接口改动不大,模块版的话是尽量和支持库接口保持一致,所以对于以前的模块接口可能改动就大了。 要解决多线程问题,主要是对sqlite3的锁机制进行了解,和事务有密切的关系。本次更新的版本在开始事务时,增加了一个 事务锁状态 的参数。 拿简单的话来描述就是 开始事务 时如果 设置了 事务锁状态_ 立即 参数,那么这个时候其他线程的连接就不能写操作了,但是可以读操作,但是在提交事务时也要等待所有读操作完成了才能提交。 设置了 事务锁状态_ 独占 参数,那么这个时候其他线程的连接读写都不可以了。 在等待的时候就处于繁忙状态,我们可以设置 数据库.繁忙超时 ()来设置等待时间。 还有种情况还是会 死锁 ,就是记录集没有关闭,而且这次更新的支持库和模块都是必须 手动关闭记录集 的,所以一定注意。 当然多进程和多线程是一个道理,具体操作看例子。 esqlite3 V1.1 相对于1.0的更新 1、增加了全局命令: S3互斥体进入 S3互斥体退出 S3聚合上下文 S3取数据库自上下文 2、增加了zySqlite数据库 命令 繁忙超时 繁忙处理 取文件名 是否只读 取互斥体 是否自动提交 进度处理 取下一记录集 取总影响行 3、增加了 zySqlite记录集 命令 是否繁忙 是否只读 取数据库句柄 取行数 4、数据库.开始事务() 增加了 事务锁状态 参数,此参数在多线程中非常重要。 5、记录集必须手动关闭,任何内部方法都不再自动关闭。
本次更新对于支持库来说,接口改动不大,模块版的话是尽量和支持库接口保持一致,所以对于以前的模块接口可能改动就大了。 要解决多线程问题,主要是对sqlite3的锁机制进行了解,和事务有密切的关系。本次更新的版本在开始事务时,增加了一个 事务锁状态 的参数。 拿简单的话来描述就是 开始事务 时如果 设置了 事务锁状态_ 立即 参数,那么这个时候其他线程的连接就不能写操作了,但是可以读操作,但是在提交事务时也要等待所有读操作完成了才能提交。 设置了 事务锁状态_ 独占 参数,那么这个时候其他线程的连接读写都不可以了。 在等待的时候就处于繁忙状态,我们可以设置 数据库.繁忙超时()来设置等待时间。 还有种情况还是会死锁,就是记录集没有关闭,而且这次更新的支持库和模块都是必须手动关闭记录集的,所以一定注意。 当然多进程和多线程是一个道理,具体操作看例子。 esqlite3 V1.1 相对于1.0的更新 1、增加了全局命令: S3互斥体进入 S3互斥体退出 S3聚合上下文 S3取数据库自上下文 2、增加了zySqlite数据库 命令 繁忙超时 繁忙处理 取文件名 是否只读 取互斥体 是否自动提交 进度处理 取下一记录集 取总影响行 3、增加了 zySqlite记录集 命令 是否繁忙 是否只读 取数据库句柄 取行数 4、数据库.开始事务() 增加了 事务锁状态 参数,此参数在多线程中非常重要。 5、记录集必须手动关闭,任何内部方法都不再自动关闭。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值