您的位置:首页 > 数据库

嵌入式数据库--SQLite简单应用(一)

2011-12-05 09:29 267 查看
简介

嵌入式数据库实际上是轻量级的,在运行时,它们需要较少的内存。

嵌入式数据库的一大好处就是在你的程序内部不需要网络配置,也不需要管理。因为客户端和服务器在同一进程空间运行。

SQLite 的数据库权限只依赖于文件系统,没有用户帐户的概念。SQLite 有数据库级锁定,没有网络服务器。

它需要的内存,其它开销很小,适合用于嵌入式设备。你需要做的仅仅是把它正确的编译到你的程序。

接口由SQLite C API组成,也就是说不管是程序、脚本语言还是库文件,最终都是通过它与SQLite交互的(我们通常用得较多的ODBC/JDBC最后也会转化为相应C API的调用)。

http://www.sqlite.org/download.html

下载sqlite-src-3070900

我们不需要TCL的支持,在编译时需要把TCL支持disable了

./configure –disable-tcl

make

生成的库(动态库、静态库)和可执行程序都在 .libs目录下

在shell下命令

建一个数据库

sqlite3 stu.db

进入了sqlite3之后,会看到以下文字:

SQLite version 3.1.3

Enter ".help" for instructions

sqlite>

建立一个表,名为stu,有name和num两个字段,以;分号结束

CREATE TABLE student(name,num);

列出所有的数据表: .tables

.tables

student

显示数据库结构:.schema

.schema student

CREATE TABLE student(name,num);

插入几个数据 insert into table_name values(data1, data2, data3, ...);

insert into stu values('Stevenbai'1,001);

insert into stu values(anjincang,1002);

查询 基本语法 select columns from table_name where expression;

导出所有数据库的内容

select * from film;

Stevenbai|1001

anjincang|1002



SQLite编程与应用

打开数据库

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

第一个参数指文件名

第二个参数则是定义的 sqlite3 ** 结构体指针(关键数据结构),称为数据库句柄。

返回值:表示操所是否正确 (SQLITE_OK 操作正常)

说明:打开一个数据库,文件名不一定要存在,如果此文件不存在,sqlite会自动创建。

关闭数据库

int sqlite3_close(sqlite3*);

参数就是刚才的结构体,也就是数据库句柄。

说明:如果用sqlite3_open开启了一个数据库,结尾时不要忘了用这个函数关闭数据库。



执行SQL语句

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

这个函数的功能是执行一条或者多条SQL语句,SQL语句之间用“;”号隔开。

建议在执行一条或者多条SQL语句得时候,指定第三个参数回调函数,在回调函数中可以获得执行Sql得详细过程,如果所有Sql执行完毕则应该返回0,否则,则说明这次执行并没有完全成功。第五个参数:如果执行失败(没有返回0)则可以查看第五个阐述得值。来查看详细错误信息。。

说明:通常sqlite3_callback和它后面的void*这两个位置都可以填NULL,表示不需要回调。比如您做insert操作,做delete操作,就没有必要使用回调。而当作select时,就要使用回调,因为sqlite3把数据查出来,得通过回调告诉你查出了什么数据。

exec的回调

typedef int (*sqlite3_callback)(void*, int, char**, char**);

例如:int LoadMyInfo( void * para, int n_column, char ** column_value, char ** column_name )

para是在 sqlite3_exec 里传入的 void * 参数,通过para参数,可以传入带有控制功能的数据

n_column是这一条记录有多少个字段 (即这条记录有多少列)

char ** column_value 是个关键值,查出来的数据都保存在这里,它实际上是个1维数组,每一个元素都是一个 char * 值,是一个字段内容(用字符串来表示,以\0结尾)

char ** column_name跟column_value是对应的,表示这个字段的字段名称

说明:回调函数必须定义为上面这个函数的类型。

取当前插入位置:

long long int sqlite3_last_insert_rowid(sqlite3*);

返回你前一次插入得位置,从1开始,sqlite3* 为你打开数据库所得到得句柄。

非回调select查询:

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

执行一次查询Sql 并且返回得到一个记录集。

说明:第三个参数是查询结果,它是一维数组,内存布局为:第一行是字段名称,后面是紧接着是每个字段的值。



释放查询结果:

void sqlite3_free_table(char **result);

释放当前查询的记录集所占用的内存。



#include<stdio.h>
#include<sqlite3.h>
#include<string.h>

int printSqlResult(void *para, int column, char **value, char **key)
{
    int i;
    printf("column=%d\n",column);
    for(i = 0; i < column; i++)
    {
        printf("%s\t",*(value+i));
    }
    printf("\n");
    return SQLITE_OK;
}
int main(int argc, char *argv[])
{
    sqlite3 *pDb;
    int j, i, pos, row, col, ret;
    char acCmd[128];
    char **ppRet;

    if(argc < 2)
    {
        printf("please input sql command!");
        return -1;
    }
    
    strcpy(acCmd,argv[1]);

    ret = sqlite3_open("./stu.db",&pDb);
    if(ret != SQLITE_OK)
    {
        printf("open database fail!\n");
        return -1;
    }

    ret = sqlite3_exec(pDb, acCmd, printSqlResult, NULL, NULL);
    {
        if(ret != SQLITE_OK)
        {
            printf("exec fail,ret %d\n", ret);
            return -1;
        }
    }
    pos = sqlite3_last_insert_rowid(pDb);
    printf("pos = %d\n",pos);

    sqlite3_get_table(pDb,"select * from stu;",&ppRet,&row,&col,NULL);

    for(i = 0; i <= row; i++)
    {
        for(j = 0; j < col; j++)
        {
            printf("%s\t",*(ppRet+i*col+j));
        }
        printf("\n");
    }
    sqlite3_free_table(ppRet);
    sqlite3_close(pDb);
    return 0;
}


[root@localhost sqlite]# ./sqlite "select * from stu;"

column=2

Stevenbai       1001

column=2

anjincang       1002

pos = 0

name    num

Stevenbai       1001

anjincang       1002


回调函数打印完一条信息再回调,看column=2打印了两次就知道。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: