热门关键字:  ubuntu  分区  Fedora  linux系统进程  函数

Berkeley DB使用全解

来源: 作者: 时间:2007-12-02 Tag: 点击:
在开发桌面级应用程序时,常常需要用到可持续存储技术,做为保存程序在退出之前所使用的数据,如变量,对象,窗口位置,大小.一般我们会使用office access这类桌面型文件数据库,或者是使用注册表.但是它们都有一些不尽人意的缺陷.比如:
1.       mdb文件无法在没有安装office的系统上访问,直少得需要为它单独安装一个组件
2.       它与注册表没法实现c++结构存储,(但是可以使用复合文档的技术来实现,以后再讲)
 
由于以上等原因,所以我们需要选择一款,适合桌面级的文件数据库.
 
版本:
Berkeley DB 4.6.18
注意,它有C和C++两个版本,都是跨本台的,这里我们主要介绍C++的
建立数据库:
#define DATABASE “MyDatabase.db” //数据库文件
Db db(NULL,0);
if (ret = db.open(NULL,DATABASE,NULL,DB_BTREE,DB_CREATE,0))
{
     db.err( ret, "%s", DATABASE);
     exit (1);
}
db.close(0);// 关闭数据库
 
插入一条记录:
注意,到目前为止,我发现它只能做到一个关键字对应一个值.
这里使用一个C++结构做为例子,稍复杂点
 
//这里建立KEY
//它可以是任何一类型数据,BerkeleyDB是以内存内容比较的,所以它也可以是个结构,当然你//不怕麻烦
Dbt key
     key.set_data((void *)&index);
     key.set_size(4);
    
也可以
     Dbt key(mykey,6); //多留个\0
 
//建立一个结构体并赋值,里面就是我们要存放的value
typedef struct
{
     int _id;
     char _username[30];
     char _password[30];
}Foo,*PFoo;
Dbt data;
    //保证每个字段都准确的写入这个缓冲,因为你写进去什么样,读出来就是什么样
     Foo foo = {1,"arthur","sj123"};
     size_t len = 4+4+strlen(foo._username)+4+strlen(foo._password);
     char *buf = new char[len];
     memset(buf,0,len);
     int slen = 0;
     memcpy(buf,(char*)&foo._id,sizeof(int));
     slen += sizeof(int);
     int namelen = strlen(foo._username);
     int passlen = strlen(foo._password);
     memcpy(buf+slen,(void*)&namelen,sizeof(int));
     slen += sizeof(int);
     memcpy(buf+slen,foo._username,namelen);
     slen += namelen;
     memcpy(buf+slen,(void*)&passlen,sizeof(int));
     slen += sizeof(int);
     memcpy(buf+slen,foo._password,passlen);
     slen += passlen;
 
     data.set_data((void *)buf); //写入Dbt
     data.set_size(slen);         //设置大小,很关键,别算错了


相关文章:
SQLite3 C/C++ 开发接口简介(API函数) 二
SQLite3 使用教学
Scaling out MySQL - Hardware today and tomorro
SQLite适用的范围
sybase cursor declare
SQL语句大全精要
用户配额
decode函数
Oracle 数据库创建表空间、创建用户指定表空间
MySQL教会我使用GnuPG验证软件包
MySQL中MyISAM引擎与InnoDB引擎性能简单测试
initdb
mysqladmin在线帮助文档
CentOS 4.7 安装Oracle 9.2.0.4的一些问题
文本如何导入oracle(sqlldr 的用法)
ORA-00600: 内部错误代码,自变量: [16201], [],
分布式Oracle的database link
install a MySQL source distribution
Mysql备份脚本(未验证)
oracle 9.2.0.1 update 9.2.0.5
每小时Dump所有mysql数据库到NAS存储设备上
Oracle SCN机制解析
Account LOCKED(TIMED)
MySQL数据库5.0的my.cnf配置选项
oracle存储过程中调用其他用户的表
修改sqlplus提示符
MYSQL建表实例
一些对Mysql DBA有用的脚本
Oracle DBA 强悍挑战OS 64位 Solaris 10-真正休
[Bugzilla]由Mysql迁移到Oracle的方法