C/C++中Sqlite使用简介

摘要:
Sqlite Manager仅提供英文版本,但功能强大。一个问题是它不支持在ANSI字符集中显示中文字符。Sqlite Admin有一个绿色的中文版本,它的功能略少于SqliteManager。对于那些熟悉Sql语句的人来说,这个版本就足够了。

一、简介

SQLite是一个基于文件的轻量级数据库,但功能还挺强,速度也很快,对于小型数据库应用开发绝对够用了。使用起来也非常方便,下面的介绍可以看出来,使用起来真的非常简单。

二、官方网站

Sqlite的官方网站www.sqlite.org,在该网站可以下载最新的sqlite版本。

三、辅助工具工具

Sqlite数据库的管理工具有SQLiteManager、SqliteAdmin等。

SqliteManager只有英文版,但功能强大,有个问题就是不支持ANSI字符集的汉字显示。其自带的帮助文档有SQL语句的详细介绍,对于不熟悉Sql语句的人来说很方便。而且它的很多操作都有自动的SQL语句提示,对于不常使用数据库的人来说也很好用。

SqliteAdmin有绿色中文版,功能相对于SqliteManager略少,对于熟悉Sql语句的人,该版本够用了。

四、C/C++使用前准备

直接将sqlite3.h和sqlite3.c加入自己的C/C++工程中,即可使用sqlite3。

五、打开关闭数据库

Sqlite支持UTF-8和UTF-16,不过它居然不支持C/C++程序中最常用的ANSI。因此数据库路径中如果包含中文字符的话,需要将路径转换成相应的字符格式。

1、以UTF-8方式打开

//打开数据库

sqlite3 *db = NULL;

intresult = sqlite3_open("c:\\abc.db", &db);

if (SQLITE_OK != result)

{

return;

}

//关闭数据库

sqlite3_close(db);

2、以UTF-16方式打开

如要以UTF-16方式打开,把打开数据库的语句改为"sqlite3_open16(L"c:\\abc.db", &db)"即可。

但一般情况,强烈不建议使用UTF-16方式打开数据库,根据我的测试,我发现如果以这种方式打开数据库,在后续创建数据表的时候,如果其中有某项为TEXT类型。那么数据表的这项数据内容,将会强制确定类型为UTF-16。也就是说,你插入的任何数据,都将被转换为UTF-16并存入数据库。而执行SQL的语句是UTF-8格式的,因此当你取出的数据和你存入的数据是不一致的,很显然这对于使用者而言是一个灾难。

六、执行SQL语句

执行SQL语句可以调用sqlite3_exec函数,一般来说,如果不需要返回的数据和错误信息,执行方式如下:

sqlite3_exec(db, strSQL, 0, 0, 0);

1、创建表

假设创建如下图所示的数据库:

C/C++中Sqlite使用简介第1张

其SQL语句为:

CREATETABLE[MyTable] ([ID] INTEGERPRIMARYKEYNOTNULL,[MyText] TEXTNULL, [MyDate] DATENOTNULL, [MyTime] TIMENULL,[MyFloat] FLOATNULL)

2、插入记录

下面是插入一条记录的示例SQL语句。

INSERTINTOMyTable (MyText, MyDate, MyTime, MyFloat) VALUES('---上班好远!', '2012-03-23', '9:00:00', 1000)

3、更新记录

下面是更新若干条记录的示例SQL语句。

UPDATEMyTable SETMyText='真的吗?', MyTime='10:00:00' WHEREID >=0 ANDID <=20

4、删除记录

下面是删除若干条记录的示例SQL语句。

DELETEFROMMyTable WHEREID >=3 ANDID <=5

5、批量操作

如果要进行大量的操作,比如要插入10000条数据,如果逐条执行SQL语句,则消耗的时间非常长。采用事务的方式批量处理,可以极大程度提升操作速度(我用1000条记录实验了一下,速度提高了500倍以上)。

下面是一个批量插入10000条数据的代码示例:

//插入条数据(在Begin和Commit之间批量操作,可以大幅度提高效率)

result = sqlite3_exec(db, "BEGIN;", 0, 0, 0);

for (inti=0; i<10000; i++)

{

//插入一条数据

result = sqlite3_exec(db,

"INSERT INTO MyTable (MyText, MyDate, MyTime, MyFloat) VALUES ('---上班好远!', '2012-03-23', '9:00:00', 1000);",

0, 0, 0);

}

result = sqlite3_exec(db, "COMMIT;", 0, 0, 0);

七、查询并返回结果
1、以表单形式返回

下面是以表单形式获取数据的示例代码:

//查询记录(返回数据表的方式)

char **pazResult;

intnRow, nCol;

sqlite3_get_table(db, "SELECT * FROM MyTable LIMIT 1000 OFFSET 2000", &pazResult, &nRow, &nCol, 0);

//nRow指示出有多少行

//nCol指示出有多少列

//从pazResult中可以解析出所有记录,记录以字符串形式返回

//第n列的名称,存放于pazResult[n]

//第n行第m列的数据,存放与paszResult[(m + 1) * nCol + m]

//使用完后,务必释放为记录分配的内存

sqlite3_free_table(pazResult);

上面的查询代码,也演示了如何查询指定位置指定条数的记录,这种查询方法在记录集非常庞大的时候很有用。

2、以回调形式返回

下面以代码形式示例如何获得查询语句返回的记录。

首先需要定义一个回调函数如下(参数意义待会再说):

intResult(void* pContext, intnCol, char** azValue, char** azName);

然后调用sqlite函数执行查询语句,在回调函数一栏输入上面定义的回调函数:

sqlite3_exec(db, "SELECT * FROM MyTable LIMIT 10 OFFSET 20", Result, 0, 0);

执行该SQL语句时,每返回一条记录都会触发一次上面的回调函数,在该回调函数的实现中,即可得到查询结果。

在上面的Result函数中,各个参数意义如下:

pContext

这个参数是调用sqlite3_exec函数是输入的第4个参数。它通常作为环境变量用于指示出当前执行代码的主体。示例代码中我忽略了这个参数,但正式使用时一般不会忽略它。

nCol

表示该条记录有多少列。

azValue

返回的数据都蕴含在该变量中,它也是一个字符串数组。azValue[n]即为第n列的数据。

azName

存放列的名称,azName[n]就是第n列的名称。

八、存取二进制数据

存取二进制数据需要用到sqlite3_bind_blob等函数,具体用法可以查看这些函数的声明。作为一个轻量级数据库,我一般不用它存储二进制数据,因此这儿不再详细描述这些内容。

免责声明:文章转载自《C/C++中Sqlite使用简介》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C# 自定义控件制作和使用实例(winform)Hadoop的管理目录下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Sql server --触发器

概念:   触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 触发器可以从 DBA...

MySQL的FLUSH句法

今天仔细看了下Flush语法,同时在工作中也经常使用Flush命令,在这儿汇总下。MySQL的FLUSH句法(清除或者重新加载内部缓存) FLUSH flush_option [,flush_option],如果你想要清除一些MySQL使用内部缓存,你应该使用FLUSH命令。为了执行FLUSH,你必须有reload权限。 flush_option 可以是下...

oracle 数据库备份 cmd 命令

语句:exp SDE/SDE@IP:1521/orcl FILE=C:数据库备份sde%date:~0,4%%date:~5,2%%date:~8,2%.dmp  COMPRESS=y direct=y log=C:数据库备份logsde%date:~0,4%%date:~5,2%%date:~8,2%.log 在这里主要要保证C盘下有数据库备份和数据库备...

【Oracle】CentOS7/CentOS8命令行重启Oracle 11G R2

写在前面 按照读者朋友的要求写了一篇《【Oracle】CentOS7/CentOS8命令行安装Oracle 11G R2》,由于读者完全是按照我的安装方式安装的Oracle数据库,也是将Oracle数据库安装在了CentOS 8虚拟机中,安装成功后,便关闭了虚拟机,等重新开启虚拟机时,Oracle数据库并没有自动启动,此时,需要我们重新启动Oracle数据...

SQLite Expert安装与注册

嵌入式软件开发中经常用到sqlite数据库,而为了更方便、直观的对数据库进行分析、处理,往往需要一个GUI软件进行管理。SQLiteExpert则是一款非常好用的软件。 一、下载与安装 下载对应的位数的SQLite Expert:http://www.sqliteexpert.com/download.html ,建议下载professional版本的,功...

SQL Server2012如何导出sql脚本并且还原数据库

上次介绍过如何通过bak文件来还原数据库文件,今天来介绍一下如何通过导出sql脚本的方式来备份并且还原新的数据库,不过这种方式比较适合数据库数据不太多的中小型数据表,下面通过SQL Server2012为例来进行说明。 一 备份数据库 1 选择某一个数据库,右键依次选择:任务==》生成脚本; 2 选择要编写脚本的数据库对象,注意此处可以选择特定的数据库对象...