SQLite CC++

SQLite CC++,第1张

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

辅助工具工具

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(Ldb)"即可。

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

执行SQL语句

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

sqlite3_exec(db,strsql,0);

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语句。

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

4、删除记录

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

DELETEFROMMytableWHEREID >=3ANDID <=5

5、批量 *** 作

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

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

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

"BEGIN;",0);

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

{

//插入一条数据

"INSERT INTO Mytable (MyText,Myfloat) VALUES ('---上班好远!',1000);",

0,0);

}

"COMMIT;",0);

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

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

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

char**pazResult;

intnRow,1)">nCol;

sqlite3_get_table("SELECT * FROM Mytable liMIT 1000 OFFSET 2000",1)">pazResult,1)">nCol,0);

//nRow指示出有多少行

//nCol指示出有多少列

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

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

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

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

sqlite3_free_table(pazResult);

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

2、以回调形式返回

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

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

intResult(voID*pContext,intchar**azValue,1)">azname);

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

"SELECT * FROM Mytable liMIT 10 OFFSET 20",1)">Result,sans-serif"> 执行该SQL语句时,每返回一条记录都会触发一次上面的回调函数,在该回调函数的实现中,即可得到查询结果。

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

pContext

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

nCol

表示该条记录有多少列。

azValue

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

azname

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

八、存取二进制数据

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

总结

以上是内存溢出为你收集整理的SQLite C/C++全部内容,希望文章能够帮你解决SQLite C/C++所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/1171608.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存