SQLite数据库常用方法汇总

                        SQLite常见用法

 

SQLite是一款轻型的数据库。能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合。占用资源非常的低,但处理速度却是相当的快。近期做了关于SQLite的项目。学会了一些初级的用法。先总结如下:

一、     获得sqlite3.lib文件

SQLite官方网站上只能下载到sqlite dll和相应的源代码,要想在VC中使用还必须用到sqlite3.lib文件(当然也可以通过LoadLibraryGetProAddress来使用,但一般项目中都会用到很多SQLite提供的函数,这样难免会显得比较麻烦)。在网上搜到此类问题的剞劂办法。具体过程如下:

1、  下载sqlite dll

2、  通过命令行使用Microsoft Visual Studio//VC98//Bin下的LIB命令生成.lib。参照如下示例。

C://Program Files//Microsoft Visual Studio//VC98//Bin>LIB /out:D://test//sqlite3.lib /MACHINE:IX86 /DEF:D://test//sqlite3.def

 

表示根据D:/test/sqlite3.def生成sqlite3.lib,并放到D:/test/路径下

二、     有了sqlite3.lib文件,就可以在VC下使用SQLite数据库了

1、 连接/关闭数据库

int  sqlite3_open(const char *filename, sqlite3 **ppDb)

filename为数据库名,如不在其当前工程路径,需要加上绝对路径,否则会在当前工程下创建一个同名的空数据库.

ppDb 为指向结构体sqlite3 指针变量的地址.

返回值:如果返回值为SQLITE_OK 的话,则表示成功.否则返回错误号.可以在sqlite3.h文件中找到错误号对应的意义,也可以通过函数sqlite3_errmsg(sqlite3*);获取错误信息

 

int sqlite3_close(sqlite3 *) 关闭数据库

2、 执行sql语句(查询数据库)

法一:

int sqlite3_exec(sqlite3*, const char *sql, sqlite3_callback, void *,  char **errmsg )

参数说明:

Sql:以”/0”结尾的sql语句;

sqlite3_callback,:为执行sql语句的回调函数,不用可以为NULL,回调函数原形下边介绍;

void *变量是作为回调函数的第一个参数的

errmsg为获取执行改函数可能得到的错误信息

 

回调函数原形:typedef int (*sqlite3_callback)( void *para, int colun_count, char **column_values, char **column_names)

Parasqlite3_exec函数中的第四个参数

colun_count:为该次查询到一行哟多少列(如果sql语句为 select * from ..,则为数据库中一条记录的列数,当sql语句为select field1field2 form时,则为你艘查的字段数)

column_names:指向字段名所在二维数组的指针

column_valuescolumn_names对应的值;

法二:

int sqlite3_get_table(sqlite3*, const char *sql, char ***resultp, int *nrow, int *ncolumn, char **errmsg );

resultp为查询结果,它内存布局是:第一行是字段名称,是紧接着是每个字段的值

其他参数同上。

对应布局如图所示(查询了2个字段):

name         id

Tom          1

Bill           2

John           3

但我们一般认为他是字符串组成的一维数组

对应关系为

result [0] = "name";      0 = 0  **ncolumn+  0

result [1] = "id";         1 = 0  **ncolumn+  1

result [2] = " Tom ";      2 = 1  **ncolumn+  0

result [3] = "1";        

result [4] = " Bill ";

result [5] = "2";

result [6 ]= "John

result [7 ]= "3;

 

          注意:使用法二后必须用sqlite3_free_table(azResult)释放资源

3执行其他sql语句

仍然使用sqlite3_exec函数执行响应的增、删、改以及创建表的sql语句;

4、获取指定数据库的相关信息

A、获取指定数据库中所有表的信息

   执行sql语句

"select * from sqlite_master where type='table' order by name"

其中有个字段为name 他所代表的就是数据表的名字

        B、获取指定表的信息包括字段名以及某个字段的类型。

            Isql语句 “select * form tab_name”通过函数sqlite3_prepare解析到sqlite3_stmt结构里去

                int sqlite3_prepare(sqlite3 *db,const char *zSql, int nByte,

sqlite3_stmt **ppStmt, char **pzTail

                 nByte表示sql语句的长度,当为-1时,该语句会自动计算其长度,

                 pzTail一般给0NULL)就行。

            II、通过函数sqlite3_step执行刚才解析到sqlite3_stmt中的sql语句,没次查询一条记录(查询一行就够了)

                int sqlite3_step(sqlite3_stmt*);

            III、利用函数获取所需信息

                //获取第N列的字段名(从0开始)

                const char *sqlite3_column_name(sqlite3_stmt*, int N);

               //获取第N列建表时声明类型(声明为varchar10),得到为varchar10))

               const char *sqlite3_column_decltype (sqlite3_stmt*, int iCol)

               //获取SQLite的类型(类型号为int型)

                 int sqlite3_column_type (sqlite3_stmt*,int);

                 #define SQLITE_INTEGER  1

#define SQLITE_FLOAT    2

#define SQLITE_TEXT3    3

#define SQLITE_BLOB     4

#define SQLITE_NULL     5

              IV、完毕之后使用sqlite3_finalize释放之前得到的结构sqlite3_stmt,示例为:

                  sqlite3_finalize( stat );

         C、获取指定表中的记录数

                      执行sql语句”select COUNT(*) from”,其结果就为指定表中的记录数,要将得到的结果从char * 型转化为int

       

三、     对二进制数据的操作。

以上有关查询、写入数据的操作都是在没有二进制字段的条件下进行的,SQLite中对含有二进制的表进行查询和写入有单独的方法。

1、 写入二进制数据

//首先将查询语句解析到结构sqlite3_stmt中去(tab_blob2个字段 IDdata)。

sqlite3_stmt * stat;

sqlite3_prepare( db, “insert into tab_blob ( ID,data) values( 10, ? )”, -1, &stat, 0 )

其中“?”表示data字段还处于未知状态,等会才插入

注意:该函数执行成功的条件为:返回值SQLITE_OK stat 不为NULL

 

//将二进制数据进行绑定

sqlite3_bind_blob( stat, 1, pdata, (int)(length_of_data_in_bytes), NULL )

第二个参数为前边“?”在表中的序号(从0开始),此处1表示第二个字段

如果有多个“?”怎么办?

那就多执行几次sqlite3_bind_blob,并且改变第二个参数。

Pdata为二进制数据在内存中的起始地址

length_of_data_in_bytes为二进制数据以字节为单位的长度

5个参数:是个析够回调函数,告诉sqlite当把数据处理完后调用此函数来析够你的数据。一般都填NULL,需要释放的内存自己用代码来释放

 

//把需要写入的数据写入数据库

int result = sqlite3_step( stat );

 

//释放sqlite3_stmt数据

sqlite3_finalize( stat );

2、 读二进制数据

sqlite3_prepare( db, “select * from tab_blob”, -1, &stat, 0 );

prepare函数返回SQLITE_OK后,表示成功

通过int result = sqlite3_step( stat );进行查询数据;

每次查询一行,返回值为SQLITE_ROW表示查询成功,当返回值不为SQLITE_ROW时表示查询结束.

 

然后是通过对应与字段类型的函数获得各个字段的值。

//获取int

int sqlite3_column_int(sqlite3_stmt*, int iCol);

//获取duble

double sqlite3_column_double(sqlite3_stmt*, int iCol);

//获取TEXT

const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);

//获取二进制型

const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);//获取二进制数据在内存地址

int sqlite3_column_bytes(sqlite3_stmt*, int iCol);//获取二进制数据的长度

四、     关于中文路径打开文件失败的处理

        很多时候我们会发现当数据库文件处于中文路径下时,就会打开文件失败。这主要是由于SQLite使用utf8格式,所以需要将其转换为相应的格式。可以通过函数

    WideCharToMultiByte(CP_UTF8,.....)进行转换,当然如果你的路径为多字节的话,你首先得将路径转换为Widechar才行。

ey:

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, 0, lpt_str, -1, data_base, 0, NULL, NULL);
 WideCharToMultiByte(CP_UTF8, 0, lpt_str, -1, data_base, size, NULL, NULL);
 
 return sqlite3_open(data_base, &m_db);
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值