文件数据库试用

文件数据库

文件数据库又叫嵌入式数据库,将整个数据库的内容保存在单个索引文件中,以便于数据库的发布。

文件数据库的3个重要特征(相对于传统数据库)

1.  数据操作接口

SQL92标准,不管是传统数据库,还是文件数据库,都必须支持SQL92标准。

2.  数据保存格式

传统数据库(DB2, Oracle, SQL server等)数据保存的方式各异。

文件数据库将数据保存在单一文件中。

3.  API支持

传统数据库都支持ODBCJDBC

某些文件数据库不支持ODBCJDBCsqlite都不支持,Berkeley DBODBCJDBC支持,Firdbird有第三方的ODBC驱动)。

 

 

文件数据库与传统数据库的比较

优势:  由于数据保存在单一文件中,数据库的部署和发布都比较简单,适用于内嵌在应用程序中。

            数据量不是太大时,速度比传统数据库要快。

缺点:  由于数据保存在单一文件中,数据库打开时,该文件会被整个load到内存,应此数据库不能过大(100M以内,个人测试)。

 

各种文件数据库的比较

Sqlite:  老牌的文件数据库,完全免费 ( public domain ),使用方便,无须任何配置,下载源代码编译成库或者直接编译到应用程序都可以(250K,C代码)。支持事务机制和blob数据类型。http://www.sqlite.org/

Berkerley DB: 更老牌的文件数据库,最稳定的数据库,完全可以取代大部分传统client/server数据库的应用场合;支持xml(代价是30M硬盘空间)。缺点是配置和使用比较复杂,不太适合小项目。

Firbird:与sqlite比较类似,有C#支持。某些发布版本不能build, 很久没有关注了。

Access:一般不考虑

 

Sqlite简单介绍

个人比较喜欢sqlite, 使用最方便,唯一的准备工作是下载250K的源;而且作者很热心,有问必答。

以下演示一下使用sqlite的步骤,先创建一个数据库,然后查询其中的内容。2个重要结构体和5个主要函数:

sqlite3               *pdb, 数据库句柄,跟文件句柄FILE很类似

sqlite3_stmt      *stmt, 这个相当于ODBCCommand对象,用于保存编译好的SQL语句

 

sqlite3_open(),   打开数据库

sqlite3_exec(),   执行非查询的sql语句

sqlite3_prepare(), 准备sql语句,执行select语句或者要使用parameter bind时,用这个函数(封装了sqlite3_exec.

Sqlite3_step(), 在调用sqlite3_prepare后,使用这个函数在记录集中移动。

Sqlite3_close(), 关闭数据库文件

 

还有一系列的函数,用于从记录集字段中获取数据,如

sqlite3_column_text(), text类型的数据。

sqlite3_column_blob(),取blob类型的数据

sqlite3_column_int(), int类型的数据

 

实例代码如下,

附件工程可直接编译,例子使用了blob数据类型。

#include "sqlite3.h"                                //包含一个头文件就可以使用所以sqlite的接口了

#include "stdlib.h"

#include "stdio.h"

#include "string.h"

 

#pragma comment(lib, "sqlite.lib")           //我把sqlite编译成了一个静态的lib文件。

 

void       createdb();

void       querydb();

 

int         main()

{

            createdb();

            querydb();

 

            return 0;

}

 

void       createdb()

{

            int                     ret;

            sqlite3               *pdb = 0;

            sqlite3_stmt      *stmt = 0;

            char                  *error = 0;

            char                  *sql = "insert into table1 values('value11',:aaa)";

            int                     index;

            static void          *value = "asdfadsfasdfjasdfjaksdfaskjdfakdsfaksfja";

 

            ret = sqlite3_open("db1.sdb", &pdb);                    //打开数据库,跟打开文本文件一样

            if( ret != SQLITE_OK )

                        return;

            ret = sqlite3_exec(pdb, "create table table1(col1 char(20), col2 BLOB)", 0,0, &error );

            if( ret != SQLITE_OK )

                        return;

 

            ret = sqlite3_prepare(pdb, sql,strlen(sql), &stmt, &error);

            if( ret != SQLITE_OK )

                        return;

 

            index = sqlite3_bind_parameter_index(stmt, ":aaa");

 

            ret = sqlite3_bind_blob(stmt, index, value, strlen(value), SQLITE_STATIC);

            if( ret != SQLITE_OK )

                        return;

 

            ret = sqlite3_step(stmt);

           

            if( ret != SQLITE_DONE )

                        return;

 

            sqlite3_close(pdb);        

}

 

void       querydb()

{

            int                     ret;

            sqlite3   *pdb = 0;

            sqlite3_stmt      *pstmt = 0;

            char      *error = 0;

            char      *sql = "select * from table1";

            int                     len;

            int                     i;

            char      *name;

            void       *value;

 

            ret = sqlite3_open("db1.sdb", &pdb);

            if( ret != SQLITE_OK )

                        return;

 

            ret = sqlite3_prepare(pdb, sql, strlen(sql), &pstmt, &error);

            if( ret != SQLITE_OK )

                        return;

 

            while( 1 )

            {

                        ret = sqlite3_step(pstmt);

                        if( ret != SQLITE_ROW )

                                    break;

 

                        name = sqlite3_column_text(pstmt, 0);

                        value = sqlite3_column_blob(pstmt, 1);

                        len = sqlite3_column_bytes(pstmt,1 );

            }

}

 

索引:

传统数据库: client/server构架的数据库

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值