您好,欢迎来到筏尚旅游网。
搜索
您的当前位置:首页CC++中Sqlite使用简介

CC++中Sqlite使用简介

来源:筏尚旅游网
CC++中Sqlite使⽤简介

⼀、简介

SQLite是⼀个基于⽂件的轻量级数据库,但功能还挺强,速度也很快,对于⼩型数据库应⽤开发绝对够⽤了。使⽤起来也⾮常⽅便,下⾯的介绍可以看出来,使⽤起来真的⾮常简单。

⼆、官⽅⽹站

Sqlite的官⽅⽹站,在该⽹站可以下载最新的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;

int result = 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、创建表

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

其SQL语句为:

CREATE TABLE [MyTable] ([ID] INTEGER PRIMARY KEY NOT NULL,[MyText] TEXT NULL,[MyDate] DATE NOT NULL, [MyTime] TIME NULL,[MyFloat] FLOAT NULL)

2、插⼊记录

下⾯是插⼊⼀条记录的⽰例SQL语句。

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

3、更新记录

下⾯是更新若⼲条记录的⽰例SQL语句。

UPDATE MyTable SET MyText='真的吗?', MyTime='10:00:00' WHERE ID >=0 AND ID <=20

4、删除记录

下⾯是删除若⼲条记录的⽰例SQL语句。

DELETE FROM MyTable WHERE ID >=3 AND ID <=5

5、批量操作

如果要进⾏⼤量的操作,⽐如要插⼊10000条数据,如果逐条执⾏SQL语句,则消耗的时间⾮常长。采⽤事务的⽅式批量处理,可以极⼤程度提升操作速度(我⽤1000条记录实验了⼀下,速度提⾼了500倍以上)。下⾯是⼀个批量插⼊10000条数据的代码⽰例:

//插⼊条数据(在Begin和Commit之间批量操作,可以⼤幅度提⾼效率)result = sqlite3_exec(db, \"BEGIN;\", 0, 0, 0);for (int i=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;int nRow, nCol;

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

//nRow指⽰出有多少⾏//nCol指⽰出有多少列

//从pazResult中可以解析出所有记录,记录以字符串形式返回//第n列的名称,存放于pazResult[n]

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

//使⽤完后,务必释放为记录分配的内存sqlite3_free_table(pazResult);

上⾯的查询代码,也演⽰了如何查询指定位置指定条数的记录,这种查询⽅法在记录集⾮常庞⼤的时候很有⽤。

2、以回调形式返回

下⾯以代码形式⽰例如何获得查询语句返回的记录。⾸先需要定义⼀个回调函数如下(参数意义待会再说):

int Result(void* pContext, int nCol, char** azValue, char** azName);

然后调⽤sqlite函数执⾏查询语句,在回调函数⼀栏输⼊上⾯定义的回调函数:sqlite3_exec(db, \"SELECT * FROM MyTable LIMIT 10 OFFSET 20\",Result, 0, 0);

执⾏该SQL语句时,每返回⼀条记录都会触发⼀次上⾯的回调函数,在该回调函数的实现中,即可得到查询结果。在上⾯的Result函数中,各个参数意义如下:pContext

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

表⽰该条记录有多少列。

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

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

nColazValueazName

⼋、存取⼆进制数据

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

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- efsc.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务