@H_
301_0@
SQLite是一款轻型的
数据库。能够
支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合。占用资源非常的低,但处理速度却是相当的快。近期做了关于
sqlite的项目。学会了一些初级的
用法。先总结如下:
@H_
301_0@一、 获得
sqlite3.lib
文件
@H_
301_0@在
sqlite官方网站上只能下载到
sqlite dll和相应的源
代码,要想在VC中使用还必须用到
sqlite3.lib
文件(当然也可以通过LoadLibrary和GetProAddress来使用,但一般项目中都会用到很多
sqlite提供的
函数,这样难免会显得比较麻烦)。在网上搜到此类问题的剞劂办法。具体过程如下:
@H_
301_0@1、 下载
sqlite dll;
@H_
301_0@2、 通过命令行使用Microsoft Visual Stu
dio\\VC98\\Bin下的LIB命令
生成.lib。参照如下示例。
@H_
301_0@C:\\Program Files\\Microsoft Visual Stu
dio\\VC98\\Bin>LIB /out:D:\\test\\
sqlite3.lib /MACHINE:IX86 /DEF:D:\\test\\
sqlite3.def
@H_
301_0@表示根据D:\test\
sqlite3.def
生成sqlite3.lib,并放到D:\test\路径下
@H_
301_0@二、 有了
sqlite3.lib
文件,就可以在VC下使用
sqlite
数据库了
@H_
301_0@1、 连接/
关闭数据库
@H_
301_0@int
sqlite3_open(const char *filename,
sqlite3 **ppDb)
@H_
301_0@filename为
数据库名,如不在其当前工程路径,需要
加上绝对路径,否则会在当前工程下创建一个同名的空
数据库.
@H_
301_0@ppDb 为指向结构体
sqlite3 指针变量的地址.
@H_
301_0@返回值:如果返回值为
sqlITE_OK 的话,则表示成功.否则返回
错误号.可以在
sqlite3.h
文件中找到
错误号对应的意义,也可以通过
函数sqlite3_errmsg(
sqlite3*);
获取错误信息
@H_
301_0@int
sqlite3_close(
sqlite3 *)
关闭数据库
@H_
301_0@2、 执行
sql语句(
查询数据库)
@H_
301_0@法一:
@H_
301_0@int
sqlite3_exec(
sqlite3*,const char *
sql,
sqlite3_callback,void *,char **errmsg )
@H_
301_0@参数说明:
@H_
301_0@
sql:以”\0”结尾的
sql语句;
@H_
301_0@
sqlite3_callback,:为执行
sql语句的回调
函数,不用可以为NULL,回调
函数原形下边介绍;
@H_
301_0@void *变量是作为回调
函数的第一个参数的
@H_
301_0@errmsg为
获取执行改
函数可能得到的
错误信息
@H_
301_0@回调
函数原形:typedef int (*
sqlite3_callback)( void *para,int colun_count,char **column_values,char **column_names)
@H_
301_0@Para:
sqlite3_exec
函数中的第四个参数
@H_
301_0@colun_count:为该次
查询到一行哟多少列(如果
sql语句为 select * from ..,则为
数据库中一条记录的列数,当
sql语句为select field1,field2 form时,则为你艘查的字段数)
@H_
301_0@column_names:指向字段名所在二维数组的指针
@H_
301_0@column_values:column_names对应的值;
@H_
301_0@法二:
@H_
301_0@int
sqlite3_get_table(
sqlite3*,char ***resultp,int *nrow,int *ncolumn,char **errmsg );
@H_
301_0@resultp为
查询结果,它内存布局是:第一行是字段
名称,是紧接着是每个字段的值
@H_
301_0@其他参数同上。
@H_
301_0@对应布局如图所示(
查询了2个字段):
@H_
301_0@name id
@H_
301_0@Tom 1
@H_
301_0@Bill 2
@H_
301_0@John 3
@H_
301_0@但我们一般认为他是字符串组成的一维数组
@H_
301_0@对应关系为
@H_
301_0@result [0] = "name"; 0 = 0 *(*ncolumn)+ 0
@H_
301_0@result [1] = "id"; 1 = 0 *(*ncolumn)+ 1
@H_
301_0@result [2] = " Tom "; 2 = 1 *(*ncolumn)+ 0
@H_
301_0@result [3] = "1";
@H_
301_0@result [4] = " Bill ";
@H_
301_0@result [5] = "2";
@H_
301_0@result [6 ]= "John
@H_
301_0@result [7 ]= "3;
@H_
301_0@ 注意:使
用法二后必须用
sqlite3_free_table(azResult)释放资源
@H_
301_0@3、执行其他
sql语句
@H_
301_0@仍然使用
sqlite3_exec
函数执行响应的增、删、改以及创建表的
sql语句;
@H_
301_0@4、
获取指定
数据库的相关信息
@H_
301_0@A、
获取指定
数据库中所有表的信息
@H_
301_0@ 执行
sql语句
@H_
301_0@"select * from
sqlite_master where type='table' order by name"
@H_
301_0@其中有个字段为name 他所代表的就是数据表的名字
@H_
301_0@ B、
获取指定表的信息
包括字段名以及某个字段的类型。
@H_
301_0@ I把
sql语句 “select * form tab_name”通过
函数sqlite3_prepare解析到
sqlite3_stmt结构里去
@H_
301_0@ int
sqlite3_prepare(
sqlite3 *db,const char *z
sql,int nByte,
@H_
301_0@
sqlite3_stmt **ppStmt,char **pzTail)
@H_
301_0@ nByte表示
sql语句的长度,当为-1时,该语句会
自动计算其长度,
@H_
301_0@ pzTail一般给0(NULL)就行。
@H_
301_0@ II、通过
函数sqlite3_step执行刚才解析到
sqlite3_stmt中的
sql语句,没次
查询一条记录(
查询一行就够了)
@H_
301_0@ int
sqlite3_step(
sqlite3_stmt*);
@H_
301_0@ III、利用
函数获取所需信息
@H_
301_0@ //
获取第N列的字段名(从0开始)
@H_
301_0@ const char *
sqlite3_column_name(
sqlite3_stmt*,int N);
@H_
301_0@ //
获取第N列建表时声明类型(声明为varchar(10),得到为varchar(10))
@H_
301_0@ const char *
sqlite3_column_decltype (
sqlite3_stmt*,int iCol)
@H_
301_0@ //
获取sqlite的类型(类型号为int型)
@H_
301_0@ int
sqlite3_column_type (
sqlite3_stmt*,int);
@H_
301_0@ #define
sqlITE_INTEGER 1
@H_
301_0@#define
sqlITE_FLOAT 2
@H_
301_0@#define
sqlITE_TEXT3 3
@H_
301_0@#define
sqlITE_BLOB 4
@H_
301_0@#define
sqlITE_NULL 5
@H_
301_0@ IV、完毕之后使用
sqlite3_finalize释放之前得到的结构
sqlite3_stmt,示例为:
@H_
301_0@
sqlite3_finalize( stat );
@H_
301_0@ C、
获取指定表中的记录数
@H_
301_0@ 执行
sql语句”select COUNT(*) from”,其结果就为指定表中的记录数,要将得到的结果从char * 型转化为int型
@H_
301_0@三、 对二进制数据的操作。
@H_
301_0@以上有关
查询、写入数据的操作都是在没有二进制字段的条件下进行的,
sqlite中对含有二进制的表进行
查询和写入有单独的
方法。
@H_
301_0@1、 写入二进制数据
@H_
301_0@//首先将
查询语句解析到结构
sqlite3_stmt中去(tab_blob2个字段 ID和data)。
@H_
301_0@
sqlite3_stmt * stat;
@H_
301_0@
sqlite3_prepare( db,“insert into tab_blob ( ID,data) values( 10,? )”,-1,&stat,0 )
@H_
301_0@其中“?”表示data字段还处于未知状态,等会才插入
@H_
301_0@注意:该
函数执行成功的条件为:返回值
sqlITE_OK 且 stat 不为NULL
@H_
301_0@//将二进制数据进行绑定
@H_
301_0@
sqlite3_bind_blob( stat,1,pdata,(int)(length_of_data_in_bytes),NULL )
@H_
301_0@第二个参数为前边“?”在表中的序号(从0开始),此处1表示第二个字段
@H_
301_0@如果有多个“?”怎么办?
@H_
301_0@那就多执行几次
sqlite3_bind_blob,并且改变第二个参数。
@H_
301_0@Pdata为二进制数据在内存中的起始地址
@H_
301_0@length_of_data_in_bytes为二进制数据以字节为单位的长度
@H_
301_0@第5个参数:是个析够回调
函数,告诉
sqlite当把数据处理完后
调用此
函数来析够你的数据。一般都填NULL,需要释放的内存自己用
代码来释放
@H_
301_0@//把需要写入的数据写入
数据库
@H_
301_0@int result =
sqlite3_step( stat );
@H_
301_0@//释放
sqlite3_stmt数据
@H_
301_0@
sqlite3_finalize( stat );
@H_
301_0@2、 读二进制数据
@H_
301_0@
sqlite3_prepare( db,“select * from tab_blob”,0 );
@H_
301_0@prepare
函数返回
sqlITE_OK后,表示成功
@H_
301_0@通过int result =
sqlite3_step( stat );进行
查询数据;
@H_
301_0@每次
查询一行,返回值为
sqlITE_ROW表示
查询成功,当返回值不为
sqlITE_ROW时表示
查询结束.
@H_
301_0@然后是通过对应与字段类型的
函数获得各个字段的值。
@H_
301_0@//
获取int型
@H_
301_0@int
sqlite3_column_int(
sqlite3_stmt*,int iCol);
@H_
301_0@//
获取duble型
@H_
301_0@double
sqlite3_column_double(
sqlite3_stmt*,int iCol);
@H_
301_0@//
获取TEXT型
@H_
301_0@const unsigned char *
sqlite3_column_text(
sqlite3_stmt*,int iCol);
@H_
301_0@//
获取二进制型
@H_
301_0@const void *
sqlite3_column_blob(
sqlite3_stmt*,int iCol);//
获取二进制数据在内存地址
@H_
301_0@int
sqlite3_column_bytes(
sqlite3_stmt*,int iCol);//
获取二进制数据的长度
@H_
301_0@四、 关于
中文路径打开
文件失败的处理
@H_
301_0@ 很多时候我们会发现当
数据库文件处于
中文路径下时,就会打开
文件失败。这主要是由于
sqlite使用utf8格式,所以需要将其转换为相应的格式。可以通过
函数
@H_
301_0@ WideCharToMultiByte(CP_UTF8,,.....)进行转换,当然如果你的路径为多字节的话,你首先得将路径转换为Widechar才行。
@H_
301_0@ey:
@H_
301_0@int
sqlite_data_operate::connect_database(const char *database_full_name) { CA2T lpt_str(database_full_name); char data_base[1024] = {0}; int size = WideCharToMultiByte(CP_UTF8,lpt_str,data_base,NULL,NULL); WideCharToMultiByte(CP_UTF8,size,NULL); return
sqlite3_open(data_base,&m_db); }