收藏 分销(赏)

Berkeley DB数据库C语言入门教程.doc

上传人:二*** 文档编号:4708675 上传时间:2024-10-10 格式:DOC 页数:119 大小:933KB
下载 相关 举报
Berkeley DB数据库C语言入门教程.doc_第1页
第1页 / 共119页
亲,该文档总共119页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

1、Berkeley DB数据库C语言入门教程12版本1 LibraryVersion 12.1.6.0序言4关于本手册9第一章 Berkeley DB概念10访问方式13如何选择访问方式14在BTree和Hash之间选择15在Queue和Recno之间选择16数据库的限制与可移植性17环境18错误返回信息19获取和使用DB20第二章 数据库21打开数据库21前期编译准备21新建项目23项目源代码25关闭数据库28数据库打开标志29管理用的方法29报错函数30在环境中管理数据库32数据库例子33Gettingstarted_common.h34Gettingstarted_common.c35第三

2、章数据库记录40使用数据库记录40读写数据库记录42存入记录43获取记录44删除记录45数据持久性46使用C结构体47使用指针的C结构体49数据库使用例子51Example_database_load.c文件52第四章 使用游标59打开和关闭游标59使用游标获取记录60搜索记录61操作冗余记录集64使用游标存储数据66使用游标删除记录69使用游标覆盖记录69游标例子71第五章 备用库(索引库)78打开和关闭备用库(索引库)80索引库提取关键词81使用多个key83从索引库中读取85删除索引记录86在索引库中使用游标88数据库连接89使用Join Cursors89索引库的例子92第六章 数据库

3、配置92设置页面大小93Overflow Pages(溢出页)93Locking(锁定)94I/O效率95定义页大小的建议96选择缓冲大小96BTree配置97允许冗余记录集97排序冗余记录97非排序的冗余记录98设置比较提取的回调函数98附录1:Linux下设置lib信息99附录2:Linux下一个完整的例子100操作系统安装100安装Berkeley DB101设置操作系统环境102修改初始化文件102设置链接库路径102写程序102编译程序104序言这个文章是我参考Oracle网站的官方英文版Oracle Berkeley DB Getting Starged with Berkeley

4、 DB for C 12c Release 1文件进行的翻译描述。我个人是希望通过翻译这个资料,把我们学习Barkeley DB所需要的技术做一个完整的梳理,完成这个文档后,希望能够把安装和编译BerkeleyDB所需的技术做一个相对完整的描述。能为大家今后学习做一个铺垫。-实验室 段吉民 2014-7-11欢迎来到Berkeley DB的世界,这篇文档对Berkeley DB12c第一版进行介绍,提供的数据库版本是12.1.6.0 。 本文作为介绍DB API的设置与使用的快速入门手册,目标是提供一个快速有效地机制,能让你进入Berkeley DB研发的世界。在本文中侧重于C语言的研发人员,

5、以及研究进城内数据管理解决方案的资深架构师。研究本文无需特定的Berkeley DB的基础或者前提。(不过最起码的C语言基础和数据库知识,还是需要的。)首先介绍的是排版格式与内容描述,一般会用加粗字体表示函数名称。例如:DB-open() 就是一个函数名称,或者变量名称。对于变量,或者一些定义类的,用斜体字表示,例如 DB_INSTALL 目录名称对于展现的源代码信息,一般使用特殊背景色表示,例如:/*File: gettingstarted_common.h*/Typedef struct stock_dbs DB *inventory_dbp; /*Database containing

6、inventory information*/DB *vendor_dbp; /*Database containing vendor information */Char *db_home_dir; /*Directory containing the database files */Char *inventory_db_name ;Char *vendor_db_name;STOCK_DBS;获取更多信息,可以参考以下资料:Getting Started with Transaction Processing for CBerkeley DB Getting Started with R

7、eplicated Applications for CBerkeley DB C API Reference GuideBerkeley DB C+ API Reference GuideBerkeley DB STL API Reference GuideBerkeley DB TCL API Reference GuideBerkeley DB Installation and Build GuideBerkeley DB Upgrade GuideBerkeley DB Getting Started with the SQL APIs以上书籍的英文版可以在网上下载。后期会根据实际需求

8、,逐步翻译完成这些书籍的。第一章 简介Berkeley DB欢迎来到Berkeley DB(简称DB)。DB是一个通用的嵌入式数据库引擎。能够提供海量数据管理服务。它从萌芽设计开始,就是为了应对嵌入进程的高吞吐量应用,高可用性数据管理(bullet-proof -防弹的 mission critical 关键业务)。DB能够从容应对从少数字节处理到TB级数据的业务。在绝大多数情况下,对DB唯一的限制是你的硬件资源。你可以通过编程操作DB提供的API完成一系列的数据库操作,包括读、写数据,管理多个数据库,执行高级的数据操作活动(例如事物处理Transactions)。由于DB是一个嵌入式的数据库

9、引擎,它是极为高速快捷的。(可以做实时数据库,效率绝非现在我们使用的大多数臃肿的关系型数据库可比。-译者注)可以做为第三方的代码库或者直接编译到你的应用软件里面。这意味着数据库将与你的应用程序在相同的内存空间中运行。与使用独立运行的数据库服务器相比,DB为你节省大量的交互操作开销。(想象一下你的程序调用各种接口(包括ADO,ODBC,JDBC等层层包装),然后再通过拥塞的网络发送请求,服务器接收请求再反向编译成可执行的代码,再提交服务器进程解析,后面一系列的操作直到最后把数据再通过网络返回来,重新通过接口返回到你的应用程序内存。-译者注)如果还嫌不够快,还有更快的,可以直接把DB放在内存中。通

10、过把经常使用的数据放入内存的方法,一次性设置,后面会自动处理该数据库的缓冲,它的操作无需牵扯程序员太大的精力。除了高速度,DB也提供极为便捷的可配置性(这里的可配置性,是指数据存储的方式,并非指数据库的编译方式-译者注)。它提供了不同的数据组织方式,命名为“Access Methods”(访问方式)。DB对于不同存储特性的数据结构,提供了不同的访问方式(截止12C版本,提供四种,BTree,Hash,Queue,Recno),程序员可以根据数据的不同组织方式,为每个数据库选择其适合的访问方式。(注意本书把精力全部集中在Btree的访问方式上,涉及的应用程序以BTree方式为主。)另一特性是DB

11、提升了它的可配置性(是指附加的子系统模块,也不是编译方式-译者注)。DB提供了多个不同的子系统,每个子系统都能在某些方面扩展DB的能力。比如某些应用,要求具有数据写保护功能,来确定数据不会因为某些异常因素造成不一致性。(比如突然的断电或者硬件故障造成的数据不一致)。为了某些应用系统,启动事物子系统(Transaction Subsystem)能够启动事物级的数据库写保护。DB能够支持的操作系统太多以至于不方便在这里列出(好有自信的描述-译者注),但可以肯定的是Berkeley DB支持所有的商用操作系统,以及众多的嵌入式平台。最后,DB支持大量的程序开发语言。除了明确指出的C语言,C+语言,J

12、ava语言接口之外,编译后的Libarary在众多的编程语言,脚本语言(例如Perl,Python)上得到完美的支持。注:在继续了解DB之前,必须明确DB不是一个关系型的数据库系统,虽然可以通过它构建一个关系型数据库系统(比如使用BerkeleyDB作为数据库引擎的Mysql),同样,DB也不支持诸如SQL(结构化查询语言),触发器等高级结构体。但是作为替代的解决方案,DB提供了最少的API操作要求来完成存储和获取数据的操作,以最高效率为追求目标。关于本手册 本手册介绍了Berkeley DB,象这样的一本手册不能够完全涵盖DB的所有中级和高级功能,例如线程库的使用或者事物的使用。但是本手册提

13、供了一个导航式的一步一步介绍DB的基础内容和库的用法。而且,本手册特别介绍了关于DB environments(数据库环境),数据库,数据库记录,存储和获取数据库记录。并且本书介绍了游标和他的用法,并且描述了辅助数据库的概念。本书中的大部分篇幅,描述集中在使用BTree访问方法。最后使用一个专门的章节介绍了使用BTree用法,描述记录复制和比较例程。本书中给出的所有例子都是被设计为使用API的举例。每一个章节的结束,都会给出一个复杂的例子,重点培养你对这一章节内容的理解和使用。并且这些例子,你可以在DB_INSTALL/examples/c/getting_started 目录下找到,并且,此

14、类用法与C+,Java的语言环境相似。第一章 Berkeley DB概念在继续介绍DB之前,有必要对BerkeleyDB的诸多概念进行一个梳理,尤其是以前使用关系型数据库的读者,这是入门的第一关。(这种嵌入式数据库的概念与传统我们接触过的Oracle,DB2,Mysql,SqlServer,Access等数据库都不一样,尤其是基础概念的差距非常大,但是可以用Mysql做一个中转站,因为Berkeley DB曾经是Mysql5版本以前选择的数据库引擎!-译者注)关于数据库记录(records)的概念:DB数据库包含有记录,理论上讲,每个记录相当于数据库中的一个单独的条目(entry,或者翻译成入

15、口)。每一个记录包含两个信息片段:Key和Data。本书中用记录的Key和记录的Data来描述它们。(可以这样理解,Key是用来在一个表中描述唯一值的属性,相当于Oracle表中RowID的概念,或者说Mysql表中的主键;而Data是一个数据结构,这个数据结构中的每一个值都对应表的一列。可以把一个Mysql表中,除了主键以外的所有列,用一个数据结构描述,这个数据结构的整体就是Data。详细的说明本文后面的例子会描述-译者注)正是由于DB数据库中使用了Key/Data配对的方式描述记录,因此有时可以被理解为一个包含有两列的表。然而,Data(有时是Key,这个要依赖于访问模式)能够保存任意复杂

16、的数据。通常情况下,C的结构体或者其他类似机制能够在记录中保存。把一个具有N列的表,分为1(Key)和N-1(Data)列,然后作为一个有两列的表来操作。注意Berkeley DB的数据库的概念非常接近关系型数据库中表的概念。因此一个DB的应用程序,往往要调用到多个数据库,就好像在一个RDBMS的应用中(关系型数据库管理系统)要用到多个表一样。与关系型系统不同,一个BerkeleyDB的数据库,只能包含一种数据组织方式,它可以(也只能是)下面四种方式之一:BTree,Hash,Queue,Recno。而在关系型数据库系统中,底层的数据访问方式通常是被隐藏起来的。无论如何,大多数的DB数据库应用

17、,要求为每一种单独的数据应用设计一个独立的数据库来存储此类数据,因而大多数DB应用要求会存在多种类型的数据。举例来讲,在一个用户管理系统中,可能会要求管理银行客户,检查客户信息,存储,地区等等资料。在关系型数据库中,会要求多个表来进行操作。而在DB中,要求设计多个数据库来满足要求。既然会存在多个数据库,那么如何才能有效管理这些数据库呢?DB应用能够使用一个名为环境(environment)的子系统扩展来有限的管理多个数据库系统。有关“环境”的概念后面会详细介绍,这里是借着多个库管理的问题引入一下。当你使用特定的结构体,调用DB API接口与数据库交互时,这些接口通常被称为“方法”(Method

18、),因为他们与C+类的方法是如此相似。同样,用来访问数据库的变量通常被称为handle(句柄)。举例:要使用一个数据库,你必须获取这个数据库的句柄!从数据库获取结果集,通常被称为getting,因为使用get()这个函数来获取。同样,向数据库保存记录,被称为put,因为使用put()函数。当你想数据库存储一条记录,这条记录会按照预定的排序方式,被有序的存放入数据库。排序的一句往往依赖于Key,但有时也会去参考Data的数值。如果你存储的数据与已有的Key相同,现有记录的Data将被新记录的Data所取代。然而,如果数据库支持duplicate records (多重记录,即一个Key和多个Da

19、ta),那么新记录将被作为多重记录保存,不会覆盖已有的记录。同样,如果数据库支持了多重记录,当使用数据库句柄获取时,只能获取结果集中的第一条记录。(从多重记录的概念引发需求,然后讲解解决方案-游标-译者注)另一个扩展机制是游标,你可以使用游标读写特定的数据。游标是用来操作数据的基本的重复者,使用游标可以对一个数据库进行从头到尾(或者从尾到头)的遍历。还可以使用游标定位特定记录。在支持多重记录的数据库中,游标是唯一的方法。最后介绍一下Secondary Database。Berkeley DB提供一种特定的数据库,名为辅助库(Secondary单词翻译含义:二级,辅助,备用,由于后面用了Prim

20、ary这个词,与之对应,翻译为辅助-译者注)。按照功能描述,辅助库作为索引而存在,为普通库(为了与辅助库区分,这里称为Primary Database。主库)提供索引服务。由于DB的记录能够包含复杂数据类型,也就是前面我们说的,把多个列(比如:姓名,年龄,籍贯,住所,邮编)包装成一个数据结构X,然后把这个数据结构X作为一个整体存进去,但是对一个给定结果的检索,只能基于这个记录的Key。通过这个Key找到一个X,再把X提取出来,由我们的程序进行分解,提取出姓名,年龄,籍贯,住所,邮编等信息。但是如果我们想查查姓名等于“张无忌”的信息,这时候就需要引入辅助库来进行操作了。(这里举例Oracle的t

21、bl_users表和索引来对应一下。Oracle的RowID相当于BerkeleyDB的Key,是一个唯一的值,这时表tbl_users就相当于Berkeley DB的数据库db_users。我们在表tbl_users上面建立一个索引idx_users,针对用户姓名建立索引,索引本身就是一个数据段,相当于Berkeley DB的辅助库dbsec_users。索引idx_users中会存储对应tbl_users的RowID和用户名,而不是存全部的tbl_users的数据。同样,dbsec_users里面会存储db_users的Key和用户名,也不会存储整个用户的数据结构-译者注)访问方式虽然本书

22、着重介绍BTree访问方式,但是依然会对所有DB能够支持的访问方式做一个简短的介绍。需要注意对于一个数据库来讲,访问方式在创建数据库的时候就被确定了。一旦选中,实际的API操作就都会通过这个方式来访问这个数据库。即使是在某些异常事件发生的时候,也只能通过选中的方式对数据库进行访问。(特定的访问方式决定了数据库文件的格式,用BTree方式创建的数据库,当然无法用Queue的算法解释-译者注)确定访问方式的第一个把关者是对Key的使用方式,或者说Key的结构类型。第二个是考虑性能。首先对四种访问方式进行一下描述:l BTree 数据被存储在一个排序过的,平衡的树状结构中。对BTree中的Key或者

23、Data的数据复杂度,不做限制。也就是说,他们可以包含一个简单的字符串或者数字,也可以是一个复杂的数据结构体。另外,虽然不是默认的行为,但是确实存在两个记录使用一个相同的Key的情况。在这种情况下,会根据数据库设置的条件,是否启用了允许重复记录,来判断是覆盖掉,还是允许多重记录的情况。l Hash 数据被存储在一个可扩展的线性哈西表中。与BTree相似,使用Hash存储方式的数据库,Key和Data记录都可以存储复杂的数据结构。同样,Hash存取方式的数据库也支持多重记录(duplicate records)l Queue 数据存储在队列中,每个成员都是固定长度的记录。每个记录使用一个逻辑数字

24、作为它的Key。这种访问方式设计的目标是快速的在队列的尾部插入记录。并且它有一个特殊设置是从队列的头部开始删除或者获取结果记录。使用Queue访问方式的特点是它能够提供与众不同的记录级别的锁定,对于并发性访问频繁的应用,queue能够提供特殊的性能优化。l Recno 数据存储可以使用固定长度,或者可变长度的记录。与Queue相似,Recno的记录也是使用逻辑记录号做为Key。如何选择访问方式在确定数据库访问方式之前,首先需要确定如何使用你数据库中记录的Key,也就是先确定一个Key的类型,如果要使用任意类型的数据(比如String类型),应该选择BTree或者Hash作为访问方式;如果使用逻

25、辑记录号码(本质上是整数),那么应该选择Queue或者Recno。如果对Key的类型选定了,下一步就需要在BTree或者Hash之间选择一个访问类型。(或者在Queue和Recno之间选择一个访问类型)在BTree和Hash之间选择对于可以完全放在内存中的小数据集来讲,BTree和Hash没有明显区别。他们的工作效率一样好。这种情况下,可以选择BTree即可,因为主流的Berkeley DB使用它。选择访问方式的关注点,并非您整个数据集的大小,而是你工作时需要操作的数据集的大小。许多应用包含有大量的数据,但是只有极少数的数据需要被频繁的访问和操作。因此需要考虑的因素只是你实际需要操作的范围,而

26、不是整个的数据集。然而随着你数据集的增长,超出了内存能够负载的范围的时候,就需要更加小心的选择你的数据库访问方式。特别关注的:当你的Key有位置相关性,(也就是Key值之间有关联,就是Key的数值不是随意的,这些值之间存在着某种关联。-译者注)应该选择BTree。因为BTree会对Key的值进行排序,因此在提取数据的时候,往往会按照这些预定顺序进行提取,提取一个数据之后,下一个很有可能就是与它相邻的记录。这样效果会好一些。而如果要提取的数据集的确非常大的时候,则建议使用Hash。对于任意给定的访问方式,Berkeley DB必须维护一定数量的内部信息,用来为访问方式提供服务。当需要提取一个大的

27、数据集的时候,DB使用Hash所需要的内存资源,会远远低于使用BTree所需的内存资源。当你的数据量增长时,内部信息维护所需的缓冲也会增带,增大到物理内存空间不足时,就会引起磁盘缓冲交互,从而引发大量的磁盘I/O操作,从而降低系统性能。(也就是说,当你要提取的数据量超出了操作系统分配给你的内存能容纳的上限时,操作系统必然会才用类似虚拟内存之类的技术,用磁盘空间来补充。这样当然会降低性能。而Hash由于需要的内存相对小,也就不容易引发这类情况,所以Berkeley DB在这里推荐使用Hash。但是如果你的数据达到了一定级别,即使你使用Hash,一样也会引发磁盘缓冲。因此数据库的前期规划很重要。-

28、译者注)总结,如果你的数据集会变得非常巨大以至于Berkeley DB不得不频繁的执行磁盘I/O来读取数据,那么使用Hash算法将比BTree更有优势,因为Hash本身占用的资源比BTree小很多。在Queue和Recno之间选择Queue或者Recno是在应用程序希望使用逻辑记录号作为主数据库的Key的时候。逻辑记录号本质上是一个整数,唯一的表示数据库中的一条记录。他们能够被设置为可变长度的或者固定的,一个可变记录号在数据库的记录被保存或者删除时,能够被改变;固定逻辑记录号则不会理会数据库执行的操作,都不能改变固定逻辑记录号(fixed logical Record number)当在Que

29、ue和Recno之间选择访问方式的时候,可供参考的条件:l Queue访问方式主要适用于应用程序存在高并发性的应用。因为Queue可以支持记录级别的锁定(其他访问方式只能提供页面级别的锁定)。并且可以在高并发的环境中快速返回结果集。但是Queue只能支持固定长度的记录。因此如果你希望数据的大小是可变的,能够兼容更多的记录类型,也许应该考虑Queue之外的访问方发。l Recno访问方式适合可变的记录数量。Queue只能适应固定记录数量。而且Recno访问方式还可以支持数据库存储完整的文本文件。Recno访问方式经常在业务应用的快速查找,临时存储中被用到。当你的数据需要被快速查找,或者修改的时候

30、,可以用Recno方式。数据库的限制与可移植性Berkeley DB能够对几乎所有的数据管理提供支持。从非常小的完全运行在内存中的数据库,到扩展的包含有数百万记录与TB级别的数据的大型数据库;一个独立的Berkeley DB数据库能够存储最多256TB的数据(一个独立BDB数据库的概念,相当于一个表。与RDBMS中数据库概念不同-译者注)。通过使用多个数据库相互配合,完全可以使用Berkeley DB来管理PB(petabytes)级别的数据信息。在一个单独的数据库中,一条独立的记录可以存储最多4GB的数据。Berkeley DB的数据库存储方式是以二进制格式存储。因此可以在不同的平台之间通用

31、。即使是在不同endian-ness(大数在前还是小数在前。前面讲过由于CPU结构的不同,Intel x86系列的处理器,是小数在高位,大数在低位,例如32位的十六进制数0x1234abcd,存储的时候,实际上是0xabcd在前,0x1234在后。而其他的架构,例如Sun Space处理器,却是高位数在前,低位数在后,存储为0x1234和0xabcd-译者注)需要注意,抛开可移植性不谈,在使用小位结尾(也就是Intel x86这一类)的结构平台上移植时,可能会突然出现某些性能问题。后文会有关于这一类的讨论。同样的,Berkeley DB和它的数据结构被设计为支持并发访问-他们是线程安全的,可以

32、在多个进程间共享数据。但是为了提供并发支持,Berkeley DB并不支持在网络文件系统(NFS或者Windows的网络共享)上安装执行数据库操作。因此需要注意,在本地的文件系统上安装配置Berkeley DB。环境本手册只是对BerkeleyDB的一个简短的介绍,它只是描述了如何构建一个非常简单的,单线程的应用。因此大量的数据库引擎的功能函数,被忽略掉。“环境”就是被忽略掉的强大功能之一。虽然“环境”在嵌入式的系统中很少被用到,但是在大多数的应用中,客户是需要有这样一个虚拟化的数据库管理子系统。环境从本质上讲,就是对一个或多个数据库的封装。首先打开一个环境,并初始化,构造一个封装的容器,然后

33、再这个容器中再打开数据库。当使用环境的时候,数据库被创建和安装在“环境”容器所指定的目录路径下。“环境”提供了大量单独数据库不具备的功能特性:l 多数据库文件(Multi-database files):允许在一个单独的物理文件或磁盘上创建多个数据库。对于那些需要打开多个数据库进行操作的应用来讲,具有多数据库文件支持是非常有价值的。l 多线程与多进程支持,当使用“环境”时,资源能够被所有打开的数据库共享,包括内存中缓冲(in-memory cache)和锁定。“环境子系统”被设计为允许多个线程 或/和 多个进程 来访问数据库。例如:你可以使用一个环境子系统启动并发数据存储,锁定子系统,以及内存

34、共享池的功能。l 事物支持(Transactional Processing):提供一个事物支持子系统允许你的数据库完全遵从ACID-保护机制(ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。-译者注)建立数据库写机制。你可以使用环境来启动事物子系统支持,并且获取对应的事物ID。l 高可用性支持(数据复制):DB提供一个复制子系统,允许一个单独的主库存在多个只读的副本文件,通过环境子系统,可以设置该功能。l 日志子系统:Berkeley DB为应用提供一个前写

35、日志功能,让应用系统得到高级别的恢复能力。启动该功能后,日志子系统允许应用执行两种恢复(“普通”级别和“灾难性”级别),通过记录的日志可以恢复数据库信息。错误返回信息在继续学习前,有必要花几分钟时间,看一下DB返回的错误信息。在程序执行过程中,DB接口总是为成功的操作返回0。如果操作不成功的话,返回非零的数值。如果一个操作系统错误发生(比如:DB无法获取到磁盘空间,或者权限不够),DB返回一个错误号,所有可能返回的错误号都比零大。如果一个操作不是由于操作系统错误,但是也没有成功执行的话,DB会返回一些特定的错误值。比如:你想获取一个并不存在的记录,DB将会返回DB_NOTFOUND,一个预定义

36、的数值,表示要求的Key没有在数据库中出现。所有可能出现的特定值都是小于0的。DB同样也提供一个用来展示错误返回值得机制。首先,db_strerror函数会把给定错误号的数据库错误描述返回一个字符串。这个函数的功能与标准C语言的strerror相似,但是它可以同时返回操作系统错误和数据库特定错误。其次,还有两个错误函数,分别是DB-err和DB-errx。这两个函数的工作方式与标准C的printf函数相似,获取方式与printf语法和参数列表相似。能够获取标准的错误字符串信息。获取和使用DB可以通过网站下载,详细的安装数据库步骤,可以在Oracle Berkeley DB Installati

37、on and Build Guide一文中找到。第二章 数据库在Berkeley DB中,数据库是一组记录的集合。记录由Key/data的对组成。从概念上讲,可以把数据库理解成具有两列的一个表。一列包含有Key,令一列包含Data。Key和Data都是用被称为DBT的结构。从根本上讲,使用一个DB的数据库包括了putting,getting,和deleting数据库记录。后面的章节将逐一介绍如何使用这些功能。打开数据库要打开一个数据库,首先需要执行db_create()函数来初始化一个DB句柄。一旦完成了句柄的初始化,你能用open()方法打开数据库。默认情况下,DB不会在数据库不存在的时候自

38、动创建。如果希望DB能够自动创建一个数据库,可以为open()函数指定DB_CREATE标志。使用VC2010做的例子:(Win32 debug)前期编译准备下载源代码,解压缩,我的目录如下:E:db-6.0.30build_windows。其中E:db-6.0.30是整个压缩文件的解压缩目录,build_windows是有关Windows平台下的源代码所在目录。文件列表如下图所示:可以看到所需的头文件都在这个目录下,双击Berkeley_DB_vs2010.sln,打开解决方案。设置编译方式为Win32平台下的Debug模式。如下图所示:在解决方案中,右键点击db,选择“生成”。如下图所示。

39、输出结果如下:1 正在生成代码.1Link:1正在创建库.build_windowsWin32Debuglibdb60d.lib 和对象 .build_windowsWin32Debuglibdb60d.exp1db.vcxproj - E:db-6.0.30build_windowsVS10.build_windowsWin32Debuglibdb60d.dll1FinalizeBuildStatus:1 正在删除文件“./.build_windowsWin32Debugdbdb.unsuccessfulbuild”。1 正在对“./.build_windowsWin32Debugdbdb.

40、lastbuildstate”执行 Touch 任务。11生成成功。11已用时间 00:00:53.37= 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 =在目录E:db-6.0.30build_windowsWin32Debug下产生了两个文件,分别是libdb60d.dll和libdb60d.lib。如下图所示:新建项目编译完了lib和dll之后,新建一个项目,用来测试数据库的打开(包括创建)和关闭的全过程。输入项目的名称,点击下一步,如图所示:点击下一步,继续。选择“控制台应用程序”,点击完成。此时完成了一个项目的构建,但是源代码部分是空的。项目源代码首先调整环境变量:

41、在探出窗口中选择VC+目录,首先设置“包含目录”,在包含目录的最后增加上“;E:db-6.0.30build_windows;”注意多个目录是使用分号来分隔的,因此E字母前面的分号,是分隔新增目录与前一个目录的。第二步,把刚才产生的libdb60d.dll和libdb60d.lib复制到程序的目录下,跟其他的源代码(E:ProjectBerkeleyDB001BerkeleyDB001)放在一起,如下图所示:然后源代码描述如下:/ BerkeleyDB001.cpp : 定义控制台应用程序的入口点。/#include stdafx.h#include #pragma comment(lib,

42、libdb60d.lib) /把编译好的Lib添加进来,作为函数声明,程序会自动调用libdb60d.dll文件int _tmain(int argc, _TCHAR* argv)DB *dbp; /*DB 结构句柄*/u_int32_t flags; /* 数据库打开标志 */int ret; /* 函数返回值 */ret = db_create(&dbp,NULL,0);if(0!=ret)return -1;flags = DB_CREATE;ret=dbp-open(dbp,NULL,my_db.db,NULL,DB_BTREE,flags,0);if(dbp!=NULL)dbp-cl

43、ose(dbp,0);return 0;编译后,直接在Debug目录下执行该程序,执行前目录内容如下:双击“BerkeleyDB001.exe”文件,自动创建数据库文件。运行后目录如下:关闭数据库一旦使用了数据库,你必须关闭它。可以使用DB-close()方法来关闭(上面的例子已经描述了)关闭一个数据库将导致它不能再被访问,直到你再次打开它。在关闭数据库之前,请先关闭该数据库的游标。在关闭数据库期间,如果有活动的游标存在,将会导致出现数据冲突错误。游标的详细描述在后面介绍。需要注意当你关闭数据库的时候,默认的情况会把缓冲的内容写入到硬盘上。你可以手工调用DB-sync()方法。(注:目前为止,

44、所有的例子都是在Windows上做的,现在主要是先接触,把Berkeley DB的入门东西熟练了。后面慢慢的扩展。一下子弄得太大,贪多嚼不烂-译者注)数据库打开标志下面介绍几个常用的数据库打开时的参数标志,注意实际的参数很多,这里只介绍在单线程下简单应用会用到的几个例子。更多的变量标志信息,参考BerkeleyDB C API 相关手册当需要用多个参数打开数据库的时候,可以使用“或运算”合并多个标志位,例如:u_int32_t open_flags=DB_CREATE|DB_EXCL; l DB_CREATE 如果数据库当前并不存在,则创建它。默认情况下,如果数据库不存在,会返回错误。l DB

45、_EXCL 独占式数据库创建。当数据库已经存在时,使用该参数将返回错误信息。这个参数也只能与DB_CREATE一起使用。l DB_RDONLY 以只读的方式打开数据库,将导致所有多数据库发出的写操作失败。l DB_TRUNCATE 物理截断(清空)一个磁盘上包含有数据库的文件。该操作将会导致所有在该文件中存放的数据库信息被物理清除。管理用的方法以下介绍的方法可能在进行数据库管理工作的时候会非常有用。DB-get_open_flags()返回当前数据库打开时的标志。如果指定的数据库尚未打开,则会导致返回一个错误信息。#include .DB *dbp; u_int32_t open_flags;

46、 dbp-get_open_flags(dbp,&open_flags); /获取当前的打开的信息。DB-remove()删除特定的数据库,如果不指定参数,整个与这个方法相关的文件将被删除。永远不要删除一个句柄处于打开状态的数据库。也永远不要删除一个打开数据库的文件。#include .DB *dbp;dbp-remove(dbp,”mydb.db”,NULL,0);DB-rename() 重命名一个特定的数据库,如果没有给定database参数,那么将会把与该方法相关的整个文件重命名。永远不要重命名一个具有打开句柄的数据库。永远不要重命名一个打开句柄数据库所属的文件。#include DB *dbp;dbp-rename(dbp,”mydb.db”,NULL,”newdb.db”,0);报错函数为了便于管理错误机制,Berkeley DB提供了多种游泳的机制1,set_errcall()函数:指定在应用程序中,用来处理错误信息的函数的名称。在应用程序执行的过程中,当一个错误发生时,可以使用set_errcall()函数,指定用来处理这个错

展开阅读全文
部分上传会员的收益排行 01、路***(¥15400+),02、曲****(¥15300+),
03、wei****016(¥13200+),04、大***流(¥12600+),
05、Fis****915(¥4200+),06、h****i(¥4100+),
07、Q**(¥3400+),08、自******点(¥2400+),
09、h*****x(¥1400+),10、c****e(¥1100+),
11、be*****ha(¥800+),12、13********8(¥800+)。
相似文档                                   自信AI助手自信AI助手
搜索标签

当前位置:首页 > 通信科技 > 开发语言

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服