<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Oracle Berkeley DB 中国研发团队的博客 &#187; Emily Fu</title>
	<atom:link href="http://www.bdbchina.com/category/emily-favorate/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bdbchina.com</link>
	<description>Oracle Berkeley DB 中国研发团队的博客</description>
	<lastBuildDate>Thu, 15 Dec 2011 10:35:52 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>深入浅出BDB的批量操作</title>
		<link>http://www.bdbchina.com/2011/07/%e6%b7%b1%e5%85%a5%e6%b5%85%e5%87%babdb%e7%9a%84%e6%89%b9%e9%87%8f%e6%93%8d%e4%bd%9c/</link>
		<comments>http://www.bdbchina.com/2011/07/%e6%b7%b1%e5%85%a5%e6%b5%85%e5%87%babdb%e7%9a%84%e6%89%b9%e9%87%8f%e6%93%8d%e4%bd%9c/#comments</comments>
		<pubDate>Tue, 12 Jul 2011 11:12:24 +0000</pubDate>
		<dc:creator>傅翠云</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[Emily Fu]]></category>
		<category><![CDATA[bdb bulk Emily 傅翠云]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=1675</guid>
		<description><![CDATA[（一）引言 
在处理大量数据时，也许你曾经面对这样的需求：
1.  查询某个时间的所有记录或者一段时间的记录；
2.  查询开通了增值业务的所有客户；
3.  查询最热门的搜索关键字；
4.  删除在某日开户的所有客户信息；
5.  更新在某网点的名称，并更新所有客户数据等等。
在上述场景中，需要对大量数据做相同的操作。如果逐条记录处理，那么频繁函数调用会消耗掉大量的计算资源，并且该方案可能不是最优的。为了有效地提高上述场景的性能，Berkeley DB 5.1（下文简称BDB）开始提供面向C，Java和C#语言的批量操作API（具体包括批量查询，更新和删除），一次即可批量返回满足需要的数据记录。
备注：
1.  BDB 3.3及以上版本支持批量查询， 4.8及以上版本支持批量更新和删除；BDB 4.8以上版本支持Java API批量查询、删除和更新。BDB 4.8及以上支持C# API批量查询，5.1及以上版本支持批量删除和更新。
2.  使用批量操作，不需要特别的编译选项。
3.  BDB SQL目前尚不支持上述批量操作。
本文将以C API为例，简要地介绍批量查询、更新和删除的原理和使用方法，并提供一个批量查询的范例。对于Java和C#用户，使用方法与C API类似，在此就不详细介绍，请参考相关文档。
（二）概述
传统的BDB是非关系型（NoSQL）数据库，每一条记录分为键值（key）和数据项（value），所有非键值的属性都存放在数据项中。BDB SQL扩展了SQL解析，使用SQL语法管理BDB数据库，目前BDB SQL尚未支持批量操作。
BDB批量操作和逐条操作的最大不同是使用缓冲区来存取输入、输出数据集。当使用批量操作时，应用程序通过记录设置缓冲区，来存取批量操作的数据集。针对不同的操作类型，缓冲区可能仅存键值，或仅存数据项，或二者皆存。例如，若查询某键值的所有数据项，则需要使用一个缓冲区，返回一定数量的数据项。
根据缓冲区是否既存键值又存数据项，BDB的批量操作分为两种模式，DB_MULTIPLE模式和DB_MULTIPLE_KEY模式。在DB_MULTIPLE的模式下，任一缓冲区只存键值或数据项。如果需要操作批量键值及其数据项，则应用程序需要为键值和数据项分别提供各自的缓冲区，且两个缓冲区里的键值和数据项一一对应。在DB_MULTIPLE_KEY模式下，应用程序仅需要提供一个缓冲区，以操作于批量记录（包括其键值和数据项）。
由于应用程序需要根据具体场合设置合理的缓冲区大小，从而达到最好的性能。下文将根据不同的操作，具体阐述缓冲区的使用，以便开发者更清晰地使用和理解BDB批量操作。
（三）批量查询
批量查询可以用来查询一个键值对应的所有数据项或者连续键值对应的所有数据项，并将查询结果分批返回到缓冲区。例如，查询某帐户的所有交易记录，假设每条交易记录长度是100字节，设置一个1024字节大小的缓冲区，每次数据库可以读取满足条件的10条记录到该缓冲区；处理完该批记录后，BDB可继续提取下一批的10条记录，直到处理完所有满足条件的记录为止。
目前BDB批量查询仅支持查询连续的数据记录。若需要查询不连续的数据记录，可以在应用程序层面做一些处理，尽可能对连续的或者相邻的记录一块做查询。
批量查询通过调用以下接口实现:
-   DB-&#62;get(DB *db,DB_TXN *txnid, DBT *key, DBT *data, u_int32_t flags)
-   DBcursor-&#62;get(DBC *DBcursor, DBT *key, DBT *data, u_int32_t flags);
根据用户提供的键值或者游标所在位置，返回该键值对应的数据项，或者游标所在位置后一定数量的数据集。在调用的接口函数中，用于返回批量结果的DBT的data域指向应用程序提供的可用缓冲区，ulen域为缓冲区大小，flags域为DB_DBT_USERMEM。
在批量查询中,DB-&#62;get()支持DB_MULTIPLE模式，而DBC-&#62;get()可以同时支持DB_MULTIPLE和DB_MULTIPLE_KEY模式。
使用不同的模式和访问方法，得到的缓冲格式不尽相同。由于应用程序需要从缓冲中依次读出每一个数据项，因此，在此将更详尽地介绍一下各种缓冲格式和读取数据项的方法。
1.  DB_MULTIPLE模式下得到的只含批量数据项或者只含批量键值的缓冲：



Data1
Data2
…
DataN
-1
LengthN
OffsetN
…
Length2
Offset2
Length1
Offset1



Img 1 DB_MULTIPLE 缓冲
读取该缓冲中的每一个数据项的过程如下：
-       DB_MULTIPLE_INIT初始化读指针；
-       DB_MULTIPLE_NEXT依次读出每一个数据项。
2.  DB_MULTIPLE_KEY模式下得到的是一个含批量键值和数据项的缓冲：
1)   当数据库为BTree或者Hash时，



Key1
Data1
…
KeyN
DataN
-1
DLengthN
DOffsetN
KLengthN
KOffsetN
 






 
…
DLength2
DOffset2
KLength1
KOffset1



Img 2 DB_MULTIPLE_KEY 非recno 缓冲
读取该缓冲中的每一个键值和数据项的过程如下：
-       DB_MULTIPLE_INIT初始化读指针；
-       [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #000000;"><strong>（一）引言 </strong></span></p>
<p><span style="color: #000000;">在处理大量数据时，也许你曾经面对这样的需求：</span></p>
<p><span style="color: #000000;">1.  查询某个时间的所有记录或者一段时间的记录；</span></p>
<p><span style="color: #000000;">2.  查询开通了增值业务的所有客户；</span></p>
<p><span style="color: #000000;">3.  查询最热门的搜索关键字；</span></p>
<p><span style="color: #000000;">4.  删除在某日开户的所有客户信息；</span></p>
<p><span style="color: #000000;">5.  更新在某网点的名称，并更新所有客户数据等等。</span></p>
<p><span style="color: #000000;">在上述场景中，需要对大量数据做相同的操作。如果逐条记录处理，那么频繁函数调用会消耗掉大量的计算资源，并且该方案可能不是最优的。为了有效地提高上述场景的性能，Berkeley DB 5.1（下文简称BDB）开始提供面向C，Java和C#语言的批量操作API（具体包括批量查询，更新和删除），一次即可批量返回满足需要的数据记录。<span id="more-1675"></span></span></p>
<p><span style="color: #000000;">备注：</span></p>
<p><span style="color: #000000;">1.  BDB 3.3及以上版本支持批量查询， 4.8及以上版本支持批量更新和删除；BDB 4.8以上版本支持Java API批量查询、删除和更新。BDB 4.8及以上支持C# API批量查询，5.1及以上版本支持批量删除和更新。</span></p>
<p><span style="color: #000000;">2.  使用批量操作，不需要特别的编译选项。</span></p>
<p><span style="color: #000000;">3.  BDB SQL目前尚不支持上述批量操作。</span></p>
<p><span style="color: #000000;">本文将以C API为例，简要地介绍批量查询、更新和删除的原理和使用方法，并提供一个批量查询的范例。对于Java和C#用户，使用方法与C API类似，在此就不详细介绍，请参考相关文档。</span></p>
<p><span style="color: #000000;"><strong>（二）概述</strong></span></p>
<p><span style="color: #000000;">传统的BDB是非关系型（NoSQL）数据库，每一条记录分为键值（key）和数据项（value），所有非键值的属性都存放在数据项中。BDB SQL扩展了SQL解析，使用SQL语法管理BDB数据库，目前BDB SQL尚未支持批量操作。</span></p>
<p><span style="color: #000000;">BDB批量操作和逐条操作的最大不同是使用缓冲区来存取输入、输出数据集。当使用批量操作时，应用程序通过记录设置缓冲区，来存取批量操作的数据集。针对不同的操作类型，缓冲区可能仅存键值，或仅存数据项，或二者皆存。例如，若查询某键值的所有数据项，则需要使用一个缓冲区，返回一定数量的数据项。</span></p>
<p><span style="color: #000000;">根据缓冲区是否既存键值又存数据项，BDB的批量操作分为两种模式，DB_MULTIPLE模式和DB_MULTIPLE_KEY模式。在DB_MULTIPLE的模式下，任一缓冲区只存键值或数据项。如果需要操作批量键值及其数据项，则应用程序需要为键值和数据项分别提供各自的缓冲区，且两个缓冲区里的键值和数据项一一对应。在DB_MULTIPLE_KEY模式下，应用程序仅需要提供一个缓冲区，以操作于批量记录（包括其键值和数据项）。</span></p>
<p><span style="color: #000000;">由于应用程序需要根据具体场合设置合理的缓冲区大小，从而达到最好的性能。下文将根据不同的操作，具体阐述缓冲区的使用，以便开发者更清晰地使用和理解BDB批量操作。</span></p>
<p><span style="color: #000000;"><strong>（三）批量查询</strong></span></p>
<p><span style="color: #000000;">批量查询可以用来查询一个键值对应的所有数据项或者连续键值对应的所有数据项，并将查询结果分批返回到缓冲区。例如，查询某帐户的所有交易记录，假设每条交易记录长度是100字节，设置一个1024字节大小的缓冲区，每次数据库可以读取满足条件的10条记录到该缓冲区；处理完该批记录后，BDB可继续提取下一批的10条记录，直到处理完所有满足条件的记录为止。</span></p>
<p><span style="color: #000000;">目前BDB批量查询仅支持查询连续的数据记录。若需要查询不连续的数据记录，可以在应用程序层面做一些处理，尽可能对连续的或者相邻的记录一块做查询。<br />
批量查询通过调用以下接口实现:<br />
-   DB-&gt;get(DB *db,DB_TXN *txnid, DBT *key, DBT *data, u_int32_t flags)<br />
-   DBcursor-&gt;get(DBC *DBcursor, DBT *key, DBT *data, u_int32_t flags);</span></p>
<p><span style="color: #000000;">根据用户提供的键值或者游标所在位置，返回该键值对应的数据项，或者游标所在位置后一定数量的数据集。在调用的接口函数中，用于返回批量结果的DBT的data域指向应用程序提供的可用缓冲区，ulen域为缓冲区大小，flags域为DB_DBT_USERMEM。<br />
在批量查询中,DB-&gt;get()支持DB_MULTIPLE模式，而DBC-&gt;get()可以同时支持DB_MULTIPLE和DB_MULTIPLE_KEY模式。</span></p>
<p><span style="color: #000000;">使用不同的模式和访问方法，得到的缓冲格式不尽相同。由于应用程序需要从缓冲中依次读出每一个数据项，因此，在此将更详尽地介绍一下各种缓冲格式和读取数据项的方法。</span></p>
<p><span style="color: #000000;">1.  DB_MULTIPLE模式下得到的只含批量数据项或者只含批量键值的缓冲：</span></p>
<table border="1" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td width="8%" valign="top"><span style="color: #000000;">Data1</span></td>
<td width="8%" valign="top"><span style="color: #000000;">Data2</span></td>
<td width="4%" valign="top"><span style="color: #000000;">…</span></td>
<td width="8%" valign="top"><span style="color: #000000;">DataN</span></td>
<td width="4%" valign="top"><span style="color: #000000;">-1</span></td>
<td width="10%" valign="top"><span style="color: #000000;">LengthN</span></td>
<td width="10%" valign="top"><span style="color: #000000;">OffsetN</span></td>
<td width="4%" valign="top"><span style="color: #000000;">…</span></td>
<td width="10%" valign="top"><span style="color: #000000;">Length2</span></td>
<td width="9%" valign="top"><span style="color: #000000;">Offset2</span></td>
<td width="10%" valign="top"><span style="color: #000000;">Length1</span></td>
<td width="9%" valign="top"><span style="color: #000000;">Offset1</span></td>
</tr>
</tbody>
</table>
<p style="text-align: center;"><span style="color: #000000;">Img 1 DB_MULTIPLE 缓冲</span></p>
<p><span style="color: #000000;">读取该缓冲中的每一个数据项的过程如下：<br />
-       DB_MULTIPLE_INIT初始化读指针；<br />
-       DB_MULTIPLE_NEXT依次读出每一个数据项。</span></p>
<p><span style="color: #000000;">2.  DB_MULTIPLE_KEY模式下得到的是一个含批量键值和数据项的缓冲：</span></p>
<p><span style="color: #000000;">1)   当数据库为BTree或者Hash时，</span></p>
<table border="1" cellspacing="0" cellpadding="0" width="94%">
<tbody>
<tr>
<td width="7%" valign="top"><span style="color: #000000;">Key1</span></td>
<td width="8%" valign="top"><span style="color: #000000;">Data1</span></td>
<td width="4%" valign="top"><span style="color: #000000;">…</span></td>
<td width="8%" valign="top"><span style="color: #000000;">KeyN</span></td>
<td width="9%" valign="top"><span style="color: #000000;">DataN</span></td>
<td width="4%" valign="top"><span style="color: #000000;">-1</span></td>
<td width="13%" valign="top"><span style="color: #000000;">DLengthN</span></td>
<td width="12%" valign="top"><span style="color: #000000;">DOffsetN</span></td>
<td width="12%" valign="top"><span style="color: #000000;">KLengthN</span></td>
<td width="11%" valign="top"><span style="color: #000000;">KOffsetN</span></td>
<td width="6%" valign="top"><span style="color: #000000;"> </span></td>
</tr>
</tbody>
</table>
<table border="1" cellspacing="0" cellpadding="0" width="57%">
<tbody>
<tr>
<td width="12%" valign="top"><span style="color: #000000;"> </span></td>
<td width="7%" valign="top"><span style="color: #000000;">…</span></td>
<td width="21%" valign="top"><span style="color: #000000;">DLength2</span></td>
<td width="19%" valign="top"><span style="color: #000000;">DOffset2</span></td>
<td width="20%" valign="top"><span style="color: #000000;">KLength1</span></td>
<td width="19%" valign="top"><span style="color: #000000;">KOffset1</span></td>
</tr>
</tbody>
</table>
<p style="text-align: center;"><span style="color: #000000;">Img 2 DB_MULTIPLE_KEY 非recno 缓冲</span></p>
<p><span style="color: #000000;">读取该缓冲中的每一个键值和数据项的过程如下：<br />
-       DB_MULTIPLE_INIT初始化读指针；<br />
-       DB_MULTIPLE_KEY_NEXT依次读出每一条记录，并获得其键值和数据项。</span></p>
<p><span style="color: #000000;">2)  当数据库为Recno或者Queue时候，</span></p>
<table border="1" cellspacing="0" cellpadding="0" width="574">
<tbody>
<tr>
<td width="48" valign="top"><span style="color: #000000;">Data1</span></td>
<td width="48" valign="top"><span style="color: #000000;">Data2</span></td>
<td width="24" valign="top"><span style="color: #000000;">…</span></td>
<td width="50" valign="top"><span style="color: #000000;">DataN</span></td>
<td width="22" valign="top"><span style="color: #000000;">0</span></td>
<td width="62" valign="top"><span style="color: #000000;">LengthN</span></td>
<td width="58" valign="top"><span style="color: #000000;">OffsetN</span></td>
<td width="58" valign="top"><span style="color: #000000;">RecnoN</span></td>
<td width="24" valign="top"><span style="color: #000000;">…</span></td>
<td width="58" valign="top"><span style="color: #000000;">Length1</span></td>
<td width="58" valign="top"><span style="color: #000000;">Offset1</span></td>
<td width="65" valign="top"><span style="color: #000000;">Recno1</span></td>
</tr>
</tbody>
</table>
<p style="text-align: center;"><span style="color: #000000;">Img 3 DB_MULTIPLE_KEY recno缓冲</span></p>
<p><span style="color: #000000;">读取该缓冲中的每一个键值和数据项的过程如下：<br />
-      DB_MULTIPLE_INIT初始化读指针；<br />
-      DB_MULTIPLE_RECNO_NEXT依次读出每一个记录，并获得其recno和数据项。</span></p>
<p><span style="color: #000000;">BDB批量查询的一个重要应用是：实现分页技术。当查询连续记录，若每条记录长度稳定，选择合适的缓冲大小，可使当前分页结果即是每次返回到缓冲的记录。若记录长度不一时，可计算当前分页的最后一个键值，并保留其后的记录，待下一次批量查询时，并到下一个分页中。当数据量较大，亦可将结果暂存在一个临时内存数据库中。</span></p>
<p><span style="color: #000000;">本文将在第六部分具体介绍一个批量查询的实例。</span></p>
<p><span style="color: #000000;"><strong>（四）批量更新</strong></span></p>
<p><span style="color: #000000;">批量更新将不同的键值和数据项一一写入给定缓冲区，并调用DB-&gt;put()写接口，批量写入或者更新这些数据记录。DB-&gt;put()支持DB_MULTIPLE和DB_MULTIPLE_KEY两种模式的批量更新。</span></p>
<p><span style="color: #000000;">1.  DB_MULTIPLE模式</span></p>
<p><span style="color: #000000;">DB-&gt;put()中的key和data分别指向两个不同的缓冲，前者存储批量键值，后者存储相同数量的批量数据项。缓冲的组装过程与访问控制相关。</span></p>
<p><span style="color: #000000;">1)  在BTree和Hash数据库中，缓冲组装过程如下：<br />
-       DB_MULTIPLE_WRITE_INIT分别初始化key和data的DBT；<br />
-       DB_MULTIPLE_WRITE_NEXT依次将每条记录的键值和数据项分别写入key和data。两个缓冲的格式与img 1相同。</span></p>
<p><span style="color: #000000;">2)  在Queue和Recno数据库中，缓冲组装过程如下<br />
-       DB_MULTIPLE_RECNO_WRITE_INIT分别初始化key和data的DBT；<br />
-       DB_MULTIPLE_RECNO_WRITE_NEXT依次将每条记录的recno和数据项分别写入key和data。存放数据项的缓冲的格式与img 1相同，存放键值的缓冲的格式如下所示：</span></p>
<table border="1" cellspacing="0" cellpadding="0" width="69%">
<tbody>
<tr>
<td width="5%" valign="top"><span style="color: #000000;">0</span></td>
<td width="15%" valign="top"><span style="color: #000000;">LengthN</span></td>
<td width="14%" valign="top"><span style="color: #000000;">OffsetN</span></td>
<td width="14%" valign="top"><span style="color: #000000;">RecnoN</span></td>
<td width="6%" valign="top"><span style="color: #000000;">…</span></td>
<td width="15%" valign="top"><span style="color: #000000;">Length1</span></td>
<td width="14%" valign="top"><span style="color: #000000;">Offset1</span></td>
<td width="14%" valign="top"><span style="color: #000000;">Recno1</span></td>
</tr>
</tbody>
</table>
<p style="text-align: center;"><span style="color: #000000;">Img 4 DB_MULTIPLE_KEY recno的键值缓冲</span></p>
<p><span style="color: #000000;">2.  DB_MULTIPLE_KEY模式</span></p>
<p><span style="color: #000000;">DB-&gt;put()中的key指向一个缓冲，该缓冲存储了成对的键值和数据项，而data为空。在BTree和Hash数据库中，缓冲的格式与Img 2相同。在Queue和Recno数据库中，缓冲的格式与Img 3相同。</span></p>
<p><span style="color: #000000;"><strong>（五）批量删除</strong></span></p>
<p><span style="color: #000000;">批量删除调用DB-&gt;del()接口，删除指定键值的所有记录，或者指定键值和数据项的所有记录。若删除二级索引中的记录，主数据库中的记录亦会被相应的删除。在逻辑上，成功的批量删除操作相当于循环地根据每一个键值或每一对键值/数据项删除其相应的记录。</span></p>
<p><span style="color: #000000;">DB-&gt;del()支持DB_MULTIPLE和DB_MULTIPLE_KEY两种模式。</span></p>
<p><span style="color: #000000;">1.  DB_MULTIPLE模式<br />
同批量更新中的DB_MULTIPLE模式类似，将一系列键值组装到key指定的缓冲中，并调用DB-&gt;del()，删除这些键值对应的一条或者多条记录。</span></p>
<p><span style="color: #000000;">2.  DB_MULTIPLE_KEY模式<br />
同批量更新中的DB_MULTIPLE_KEY模式类似，将一系列键值和其数据项组装到key指定的缓冲中，并调用DB-&gt;del()，删除这些键值和数据项所在的记录。</span></p>
<p><span style="color: #000000;"><strong>（六）运行示例程序</strong></span></p>
<p><span style="color: #000000;">在BDB发布包中的&lt;db-x.y.z&gt;/examples/c/ex_bulk.c演示了批量查询，更新和删除操作。这里将提供BTree数据库中批量查询的代码片段，并通过代码注释进行讲解。</span></p>
<p><span style="color: #000000;">本文将提供BTree数据库中批量查询的片段。</span></p>
<p><span style="color: #000000;"><code><br />
DBC *dbcp;<br />
DBT key, data;<br />
size_t retklen, retdlen;<br />
char *retkey, *retdata;<br />
int ret, t_ret;<br />
void *p;</code></span></p>
<p><span style="color: #000000;"><code>memset(&amp;key, 0, sizeof(key));<br />
memset(&amp;data, 0, sizeof(data));</code></span></p>
<p><span style="color: #000000;"><code>/* 分配5MB的缓冲空间 */<br />
#define    BUFFER_LENGTH    (5 * 1024 * 1024)<br />
if ((data.data = malloc(BUFFER_LENGTH)) == NULL)<br />
return (errno);<br />
data.ulen = BUFFER_LENGTH;<br />
data.flags = DB_DBT_USERMEM;</p>
<p>if ((ret = dbp-&gt;cursor(dbp, NULL, &amp;dbcp, 0)) != 0) {<br />
dbp-&gt;err(dbp, ret, "DB-&gt;cursor");<br />
free(data.data);<br />
return (ret);<br />
}</p>
<p>for (;;) {<br />
/* 游标遍历数据库，依次返回50MB的数据 */<br />
if ((ret = dbcp-&gt;c_get(dbcp,<br />
&amp;key, &amp;data, DB_MULTIPLE_KEY | DB_NEXT)) != 0) {<br />
if (ret != DB_NOTFOUND)<br />
dbp-&gt;err(dbp, ret, "DBcursor-&gt;c_get");<br />
break;<br />
}</p>
<p>/* 依次提取缓冲中每条数据 */<br />
for (DB_MULTIPLE_INIT(p, &amp;data);;) {<br />
DB_MULTIPLE_KEY_NEXT(p,<br />
&amp;data, retkey, retklen, retdata, retdlen);<br />
if (p == NULL)<br />
break;<br />
}<br />
}</p>
<p></code></span></p>
<p><span style="color: #000000;"><code>if ((t_ret = dbcp-&gt;c_close(dbcp)) != 0) {<br />
dbp-&gt;err(dbp, ret, "DBcursor-&gt;close");<br />
if (ret == 0)<br />
ret = t_ret;<br />
}<br />
free(data.data);<br />
</code></span></p>
<p><span style="color: #000000;"><strong>(七) 总结</strong></span></p>
<p><span style="color: #000000;">从上文可以看出，BDB通过引入缓冲区的技术实现了批量查询、批量更新和批量删除操作。事实证明，在大多数情况下可以获得明显的性能提升和减少磁盘IO的次数。当然，缓冲区大小的设置根据各个应用场合会不同，如何保证性能的同时兼顾缓冲区的大小是需要测试来获得的。<del datetime="2011-07-11T18:23" cite="mailto:Chao"></del></span></p>
<p><span style="color: #000000;">关于BDB的批量操作更详尽的信息，请参考文档：</span></p>
<ul>
<li><span style="color: #000000;"><a href="http://download.oracle.com/docs/cd/E17076_02/html/programmer_reference/am_misc_bulk.html"> http://download.oracle.com/docs/cd/E17076_02/html/programmer_reference/am_misc_bulk.html</a></span></li>
<li> <span style="color: #000000;"><a href="http://download.oracle.com/docs/cd/E17076_02/html/api_reference/C/dbt.html">http://download.oracle.com/docs/cd/E17076_02/html/api_reference/C/dbt.html</a></span></li>
</ul>
<p><span style="color: #000000;">关于BDB的更详尽的信息，请参考文档：</span></p>
<ul>
<li><span style="color: #000000;">BDB：http://download.oracle.com/docs/cd/E17076_02/html/</span></li>
<li><span style="color: #000000;">BDB中文博客：http://www.bdbchina.com/</span></li>
<li><span style="color: #000000;">BDB微博：http://weibo.com/bdbchina</span></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2011/07/%e6%b7%b1%e5%85%a5%e6%b5%85%e5%87%babdb%e7%9a%84%e6%89%b9%e9%87%8f%e6%93%8d%e4%bd%9c/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>BDB的Btree结构以及影响Btree性能的各种配置和方法</title>
		<link>http://www.bdbchina.com/2010/10/bdb%e7%9a%84btree%e7%bb%93%e6%9e%84%e4%bb%a5%e5%8f%8a%e5%bd%b1%e5%93%8dbtree%e6%80%a7%e8%83%bd%e7%9a%84%e5%90%84%e7%a7%8d%e9%85%8d%e7%bd%ae%e5%92%8c%e6%96%b9%e6%b3%95/</link>
		<comments>http://www.bdbchina.com/2010/10/bdb%e7%9a%84btree%e7%bb%93%e6%9e%84%e4%bb%a5%e5%8f%8a%e5%bd%b1%e5%93%8dbtree%e6%80%a7%e8%83%bd%e7%9a%84%e5%90%84%e7%a7%8d%e9%85%8d%e7%bd%ae%e5%92%8c%e6%96%b9%e6%b3%95/#comments</comments>
		<pubDate>Sat, 09 Oct 2010 10:26:32 +0000</pubDate>
		<dc:creator>傅翠云</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[Emily Fu]]></category>
		<category><![CDATA[btree 性能 配置 Emily 傅翠云]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=1433</guid>
		<description><![CDATA[Berkeley DB（以下简称BDB）支持四种访问方法，Btree，hash，queue，recno。BTree访问方法使用多叉BTree存储数据，hash访问方法使用可动态扩展的哈希表存储数据，queue访问方法支持顺序或逻辑记录数访问定长数据，recno访问方法支持顺序或逻辑记录数访问定长或者非定长数据，其中Btree应用最为广泛。本文将深入探讨BDB中Btree的结构以及影响Btree性能的各种配置和方法，旨在引导读者更好的理解和优化Btree的使用，转载请注明出处。
I.	BDB中Btree结构
BDB中Btree存储数据库的元数据信息，索引及数据信息。元数据信息存储在元数据结点上，索引及数据本身等以不同的数据格式存储在相应的结点上。



如上图所示，Btree有五种类型的结点（页），元数据结点，中间结点，叶子结点，溢出结点和重复结点。他们分别以P_BTREEMETA，P_IBTREE，P_LBTREE，P_OVERFLOW和P_LDUP的类型存在。除了元数据结点以外，其他结点都以Btree页为基本格式存在：

typedef struct _db_page {
DB_LSN    lsn;			/* 00-07: 日志序列号. */
db_pgno_t pgno;			/* 08-11: 当前页号*/
db_pgno_t prev_pgno;		/* 12-15: 前一页. */
db_pgno_t next_pgno;		/* 16-19: 后一页. */
db_indx_t entries;			/* 20-21: 页里数据个数. */
db_indx_t hf_offset;		/* 22-23: 空闲字节偏移量最高位. */
u_int8_t  level;			/* 24: Btree 树层. */
u_int8_t  type;			/* 25: 页类型. */
} PAGE;
Btree中每页至少含有上述26个字节的头部分，若有校验，其后紧跟校验码。此后则是数据部分，根据页类型不同，数据分布各有不同。
下面分别介绍这五种不同结点。
1.	元数据结点
元数据包含与该Btree数据库相关的特定信息，以BTMETA33（或者BTMETA）的结构存在，分为基本元信息DBMETA33（或者DBMETA）和Btree特定元信息。
Btree特定元信息包括Btree页最小key个数，根结点，加密，校验等等，基本元信息包括日志序列号，当前页号，版本号，页大小，页类型，最后一页页号，分区号等等。
Btree的元数据信息存储在同一页，以便操作过程中频繁被访问。Btree元数据结构占用空间512字节，因此Btree的页大小的下限是512字节。
2.	中间结点
Btree的中间结点存储着key的索引。在Btree页头以后，在index的位置依次存储页内每一条索引记录的偏移量，而索引记录本身从尾部开始存储。每一条索引记录结构如下：

typedef struct _binternal {
db_indx_t  len;			/* 00-01: key数据长度. */
u_int8_t   type;			/* 02: [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #1d1d1d;">Berkeley DB（以下简称BDB）支持四种访问方法，Btree，hash，queue，recno。BTree访问方法使用多叉BTree存储数据，hash访问方法使用可动态扩展的哈希表存储数据，queue访问方法支持顺序或逻辑记录数访问定长数据，recno访问方法支持顺序或逻辑记录数访问定长或者非定长数据，其中Btree应用最为广泛。本文将深入探讨BDB中Btree的结构以及影响Btree性能的各种配置和方法，旨在引导读者更好的理解和优化Btree的使用，转载请注明出处。</span></p>
<p><span style="color: #1d1d1d;">I.	BDB中Btree结构<br />
BDB中Btree存储数据库的元数据信息，索引及数据信息。元数据信息存储在元数据结点上，索引及数据本身等以不同的数据格式存储在相应的结点上。</span></p>
<p><span style="color: #1d1d1d;"><span id="more-1433"></span><br />
</span></p>
<p style="text-align: center;"><span style="color: #1d1d1d;"><a href="http://www.bdbchina.com/wp-content/uploads/2010/10/btree.png"><img class="size-full wp-image-1445 aligncenter" title="btree" src="http://www.bdbchina.com/wp-content/uploads/2010/10/btree.png" alt="" width="451" height="231" /></a></span></p>
<p><span style="color: #1d1d1d;">如上图所示，Btree有五种类型的结点（页），元数据结点，中间结点，叶子结点，溢出结点和重复结点。他们分别以P_BTREEMETA，P_IBTREE，P_LBTREE，P_OVERFLOW和P_LDUP的类型存在。除了元数据结点以外，其他结点都以Btree页为基本格式存在：</span></p>
<p style="text-align: center;"><span style="color: #1d1d1d;"><a href="http://www.bdbchina.com/wp-content/uploads/2010/10/page.png"><img class="size-medium wp-image-1436 aligncenter" title="page" src="http://www.bdbchina.com/wp-content/uploads/2010/10/page-300x249.png" alt="" width="198" height="169" /></a></span></p>
<blockquote><p><span style="color: #1d1d1d;">typedef struct _db_page {<br />
DB_LSN    lsn;			/* 00-07: 日志序列号. */<br />
db_pgno_t pgno;			/* 08-11: 当前页号*/<br />
db_pgno_t prev_pgno;		/* 12-15: 前一页. */<br />
db_pgno_t next_pgno;		/* 16-19: 后一页. */<br />
db_indx_t entries;			/* 20-21: 页里数据个数. */<br />
db_indx_t hf_offset;		/* 22-23: 空闲字节偏移量最高位. */<br />
u_int8_t  level;			/* 24: Btree 树层. */<br />
u_int8_t  type;			/* 25: 页类型. */<br />
} PAGE;</span></p></blockquote>
<p><span style="color: #1d1d1d;">Btree中每页至少含有上述26个字节的头部分，若有校验，其后紧跟校验码。此后则是数据部分，根据页类型不同，数据分布各有不同。</span></p>
<p><span style="color: #1d1d1d;">下面分别介绍这五种不同结点。<br />
1.	元数据结点<br />
元数据包含与该Btree数据库相关的特定信息，以BTMETA33（或者BTMETA）的结构存在，分为基本元信息DBMETA33（或者DBMETA）和Btree特定元信息。</span></p>
<p><span style="color: #1d1d1d;">Btree特定元信息包括Btree页最小key个数，根结点，加密，校验等等，基本元信息包括日志序列号，当前页号，版本号，页大小，页类型，最后一页页号，分区号等等。</span></p>
<p><span style="color: #1d1d1d;">Btree的元数据信息存储在同一页，以便操作过程中频繁被访问。Btree元数据结构占用空间512字节，因此Btree的页大小的下限是512字节。</span></p>
<p><span style="color: #1d1d1d;">2.	中间结点<br />
Btree的中间结点存储着key的索引。在Btree页头以后，在index的位置依次存储页内每一条索引记录的偏移量，而索引记录本身从尾部开始存储。每一条索引记录结构如下：</span></p>
<blockquote><p><span style="color: #1d1d1d;"><br />
typedef struct _binternal {<br />
db_indx_t  len;			/* 00-01: key数据长度. */<br />
u_int8_t   type;			/* 02: 页类型和删除标记. */<br />
u_int8_t   unused;		/* 03: 未用空间. */<br />
db_pgno_t  pgno; 		/* 04-07: 指向页的页号. */<br />
db_recno_t nrecs;			/* 08-11: 子树个数. */<br />
u_int8_t   data[1];		/* key内容. */<br />
} BINTERNAL;</span></p></blockquote>
<p><span style="color: #1d1d1d;">一个中间结点包含PAGE中的头信息及众多BINTERNAL索引记录，其页结构如下：</span></p>
<p style="text-align: center;"><span style="color: #1d1d1d;"><a href="http://www.bdbchina.com/wp-content/uploads/2010/10/internal.png"><img class="size-medium wp-image-1440 aligncenter" title="internal" src="http://www.bdbchina.com/wp-content/uploads/2010/10/internal-300x249.png" alt="" width="202" height="168" /></a></span></p>
<p><span style="color: #1d1d1d;">其中上一页页号(prev pgno)为父亲结点的页号，下一页页号(next pgno)不维护。</span></p>
<p><span style="color: #1d1d1d;">Btree的中间结点的层数很大程度上影响了查询效率。BDB的Btree是平衡树，但通常情况下中间结点不会超过三层。假设Btree数据库页大小为4096字节，无校验，32位整型key，理想情况下，任何一个中间结点可索引(4096 &#8211; 26) / (12 + 4) = 254个key，则一层中间结点最多可索引254个key，两层中间结点最多可索引254 * 254 = 64516个key，三层中间结点可索引最多可索引(254 * 254) ^2 = 4162314256个key。当key较大时，用户可适度扩大页的大小，以增加每一个页索引的个数，减少 Btree树的层数。</span></p>
<p><span style="color: #1d1d1d;">3.	叶子结点<br />
叶子结点存储key和data的内容。与中间结点类似，此类结点的页头后面分别存储着每对key和data的偏移量，且在页尾成对存储着key和data相应的数据记录。每一条数据记录结构如下：</span></p>
<blockquote><p><span style="color: #1d1d1d;"><br />
typedef struct _bkeydata {<br />
db_indx_t len;				/* 00-01: key数据长度. */<br />
u_int8_t  type;			/* 02: 页类型和删除标记. */<br />
u_int8_t  data[1];			/* key/data内容. */<br />
} BKEYDATA;</span></p></blockquote>
<p><span style="color: #1d1d1d;">一个叶子结点包含PAGE中的头信息及众多BKEYDATA数据记录，其页结构如下：</span></p>
<p style="text-align: center;"><span style="color: #1d1d1d;"><a href="http://www.bdbchina.com/wp-content/uploads/2010/10/keydata.png"><img class="size-medium wp-image-1441 aligncenter" title="keydata" src="http://www.bdbchina.com/wp-content/uploads/2010/10/keydata-300x242.png" alt="" width="207" height="168" /></a></span></p>
<p><span style="color: #1d1d1d;">叶子结点的上一页页号记录上一个叶子结点的页号，下一页页号记录下一个叶子结点的页号。叶子结点之间是相互链接的，因此，遍历整个数据库仅需要依次访问下一页（或者上一页）叶子结点即可。</span></p>
<p><span style="color: #1d1d1d;">页中间的空闲区越小，该页的利用率越高。当一页的空闲区不足以插入一条新数据时，该页将被分裂，该页一半的数据将分配到新页中。频繁的分裂可能产生大量较低利用率的页，如果可优化插入的数据使其有序，可在一定程度上避免出现大量低利用率的页。</span></p>
<p><span style="color: #1d1d1d;">利用率低的页浪费较多空间，而且增加了访问这些页中数据所需要读的页的个数，从而影响访问效率。然而，空间利用率并不是越高越好，由于BDB是页级锁，若一个页的记录较多，其更新的并发性也相对较弱。因此，页的空间利用率并非总是越高越好，需要根据具体的应用场景做出合理的选择。</span></p>
<p><span style="color: #1d1d1d;">4.	溢出结点<br />
当存储的索引或记录数据的大小超过约四分之一页时，该数据内容将依次存储在几个溢出结点中，并组成一个溢出链表。该条溢出数据将首个溢出结点的页号，数据长度等记录在其相应的中间结点或者叶子结点中。每一条溢出数据（key或者data）的结构如下：</span></p>
<blockquote><p><span style="color: #1d1d1d;"><br />
typedef struct _boverflow {<br />
db_indx_t unused1; 		/* 00-01: 未用填充空间. */<br />
u_int8_t  type;			/* 02: 页类型和删除标记. */<br />
u_int8_t  unused2;		/* 03: 未用填充空间. */<br />
db_pgno_t pgno;			/* 04-07: 页号. */<br />
u_int32_t tlen;			/* 08-11: 完整长度. */<br />
} BOVERFLOW;</span></p></blockquote>
<p style="text-align: center;"><span style="color: #1d1d1d;"><a href="http://www.bdbchina.com/wp-content/uploads/2010/10/overflow.png"><img class="size-full wp-image-1442 aligncenter" title="overflow" src="http://www.bdbchina.com/wp-content/uploads/2010/10/overflow.png" alt="" width="452" height="258" /></a></span></p>
<p><span style="color: #1d1d1d;">溢出链表中每一个结点的页头开始顺序存储溢出数据。任何一个溢出链表仅保存一个溢出数据，因此，每一个溢出链表最后一个溢出结点上的剩余空闲块将无法被下一个溢出数据复用。</span></p>
<p><span style="color: #1d1d1d;">当溢出数据普遍存在于各个记录时，亦可考虑将该类溢出数据存储在其他数据库（例如hash）中，在当前数据库中仅存储其引用。例如，每一个图片信息分为元数据和图片数据，元数据包括图片编号，图片名，作者，创作时间，图片数据则是图片本身。在BDB中，若将元数据和图片数据存储在同一条Btree记录中，由于图片数据较大，元数据和图片数据都将被存储在溢出结点中，每次访问图片元数据都需要访问一个叶子或中间结点，再找到其相应的溢出结点。此时，可在Btree数据库中存储图片的元数据，而在hash数据库中存储图片编号及图片本身。这样，当频繁访问图片元数据时，不需要每次读出溢出结点，从而提高访问性能。</span></p>
<p><span style="color: #1d1d1d;">5.	重复结点<br />
当同一个key允许有多个不同的data时，即key可重复时，其相应的data将以BOVERFLOW的结构存储在当前叶子结点中，其中的页号为当前key的重复链表的第一个结点的页号。重复结点跟中间结点类似，不同的是，重复结点仅存储同一个key对应的各个data。</span></p>
<p style="text-align: center;"><span style="color: #1d1d1d;"><a href="http://www.bdbchina.com/wp-content/uploads/2010/10/duplicate.png"><img class="size-full wp-image-1439 aligncenter" title="duplicate" src="http://www.bdbchina.com/wp-content/uploads/2010/10/duplicate.png" alt="" width="421" height="156" /></a></span></p>
<p><span style="color: #1d1d1d;">以上关于不同结点的结构均可在源代码中的dbinc/db_page.h中找到。</span></p>
<p><span style="color: #1d1d1d;">II.	使用工具查看Btree的统计信息和内容<br />
1.	db_stat<br />
db_stat是BDB自带的工具，提供了BDB环境中数据库、事务、锁、缓存等统计信息，其相应的API是 DB-&gt;stat()或DB-&gt;stat_print()。</span></p>
<p><span style="color: #1d1d1d;">”db_stat -d”可查看某个具体数据库信息，Btree数据库的统计信息包括：</span></p>
<p style="padding-left: 30px;"><span style="color: #1d1d1d;"><br />
-	Btree magic number： Btree幻数<br />
-	Btree version number： Btree版本号<br />
-	Byte order：字节顺序<br />
-	Flags： 配置<br />
-	Minimum keys per-page： 每页key的最少数目<br />
-	Underlying database page size：页大小<br />
-	Overflow key/data size： 溢出key/data字节数<br />
-	Number of levels in the tree： 树的层数<br />
-	Number of unique keys in the tree： 不重复的key的个数<br />
-	Number of data items in the tree：data的个数<br />
-	Number of tree internal pages： 中间结点的个数<br />
-	Number of bytes free in tree internal pages： 中间结点的空闲字节数<br />
-	Number of tree leaf pages：叶子结点的个数<br />
-	Number of bytes free in tree leaf pages：叶子结点中的空闲字节数<br />
-	Number of tree duplicate pages：重复结点的个数<br />
-	Number of bytes free in tree duplicate pages： 重复页的空闲字节数<br />
-	Number of tree overflow pages：溢出结点的个数<br />
-	Number of bytes free in tree overflow pages ：溢出结点的空闲字节数<br />
-	Number of empty pages：空页的个数<br />
-	Number of pages on the free list：空闲列表中的页个数</span></p>
<p><span style="color: #1d1d1d;">根据上述统计信息，可获知Btree的key/data数目，不同结点的空间使用情况。可据此做适当的调优，例如调整页大小以获得更佳的空间利用率，压紧以释放空闲空间等等。</span></p>
<p><span style="color: #1d1d1d;">2.	db_dump<br />
db_ dump是BDB自带的工具，用于查看数据内容，其输出格式包括两部分：头部分和数据部分，头部分包括版本，格式，类型，设置，页大小等等。如下所示：</span></p>
<p style="padding-left: 30px;"><span style="color: #1d1d1d;"><br />
VERSION=3<br />
format=bytevalue<br />
type=Btree<br />
duplicates=<br />
db_pagesize=<br />
…<br />
HEADER=END<br />
…<br />
DATA=END</span></p>
<p><span style="color: #1d1d1d;">db_dump可直观地看到数据在BDB的存储内容，亦可结合db_load完成数据迁移工作。当数据库没有开启事务时，亦可辅助拯救出错页前的有效数据。</span></p>
<p><span style="color: #1d1d1d;">III.	配置Btree<br />
以下配置Btree的方法都应在打开Btree前完成。<br />
1.	设置页大小：DB-&gt;set_pagesize()<br />
2.	设置缓存大小：DB-&gt;set_cachesize()<br />
3.	设置Btree中key的比较函数：DB-&gt;set_bt_compare()<br />
默认按照字典顺序大小，短字节排在长字节前。<br />
4.	设置Btree中间结点的前缀比较函数：DB-&gt;set_bt_prefix()<br />
保证key的唯一性的前提下，尽可能减少中间结点存储的key的字节数，当key有大量重复的字节时，可减小树的大小及提高查询性能。<br />
5.	设置Btree压缩函数：DB-&gt;set_bt_compress()<br />
默认压缩函数在所有key上执行前缀压缩，当压缩后的key与前一个相同时，则对data进行压缩。若要使用定制的压缩函数，则需要提供其相应的解压函数。<br />
6.	设置允许重复或者有序重复：DB-&gt;set_flags()<br />
设置DB_DUP允许同一个key有不同data，设置DB_DUPSORT类似DB_DUP，且这些data是有序的。<br />
7.	设置重复比较函数：DB-&gt;set_dup_compare()<br />
同一个key的不同data之间的比较函数。<br />
8.	设置每页最小key数：DB-&gt;set_bt_minkey()<br />
设置每页中至少有多少个key。<br />
9.	设置记录数：DB-&gt;set_flags()中设置DB_RECNUM<br />
除了key以外，允许使用记录数获取Btree里的记录。<br />
10.	设置反向分裂：DB-&gt;set_flags()中设置DB_REVSPLITOFF<br />
当数据库周期性地增大和缩小时，可关闭反向分裂，避免死锁，提高性能。</span></p>
<p><span style="color: #1d1d1d;">IV.	其他Btree常用方法<br />
1.	DB-&gt;compact()<br />
压紧数据库并选择性地释放空闲链表上的页。可通过配置Btree填充率，释放页个数及时延，来控制压紧过程。另外，可对整个数据库进行压紧，亦可只释放空闲链表中已有的页空间。</span></p>
<p><span style="color: #1d1d1d;">2.	DB-&gt;key_range()<br />
DB-&gt;key_range()可查看当前key在数据库所有key中的大概位置，大于，小于或者等于该key的比例。</span></p>
<p><span style="color: #1d1d1d;">V.	参考文档<br />
</span></p>
<ul>
<li><span style="color: #1d1d1d;"> <a title="BDB C API" href="http://download.oracle.com/docs/cd/E17076_01/html/api_reference/C/index.html">C API文档</a></span></li>
</ul>
<ul>
<li><span style="color: #1d1d1d;"> <a title="Btree访问方法" href="http://download.oracle.com/docs/cd/E17076_02/html/programmer_reference/am_conf.html#id3475126">Btree访问方法</a></span></li>
</ul>
<ul>
<li><span style="color: #1d1d1d;"> <a href="http://download.oracle.com/docs/cd/E17076_02/html/programmer_reference/am_conf_select.html#id3475130">哈希和Btree的选择</a></span></li>
</ul>
<ul>
<li><span style="color: #1d1d1d;"> <a href="http://download.oracle.com/docs/cd/E17076_02/html/programmer_reference/bt_conf.html">Btree的专用方法</a></span></li>
</ul>
<ul>
<li><span style="color: #1d1d1d;"> <a href="http://download.oracle.com/docs/cd/E17076_02/html/programmer_reference/am_misc_diskspace.html#id3484892">Btree的磁盘需要</a><br />
</span></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/10/bdb%e7%9a%84btree%e7%bb%93%e6%9e%84%e4%bb%a5%e5%8f%8a%e5%bd%b1%e5%93%8dbtree%e6%80%a7%e8%83%bd%e7%9a%84%e5%90%84%e7%a7%8d%e9%85%8d%e7%bd%ae%e5%92%8c%e6%96%b9%e6%b3%95/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle Berkeley DB SQL全文检索简介</title>
		<link>http://www.bdbchina.com/2010/04/oracle-berkeley-db-sql%e5%85%a8%e6%96%87%e6%a3%80%e7%b4%a2%e7%ae%80%e4%bb%8b/</link>
		<comments>http://www.bdbchina.com/2010/04/oracle-berkeley-db-sql%e5%85%a8%e6%96%87%e6%a3%80%e7%b4%a2%e7%ae%80%e4%bb%8b/#comments</comments>
		<pubDate>Wed, 14 Apr 2010 09:49:35 +0000</pubDate>
		<dc:creator>傅翠云</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[Emily Fu]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Emily]]></category>
		<category><![CDATA[full-text search]]></category>
		<category><![CDATA[傅翠云]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=1164</guid>
		<description><![CDATA[  // （一） 背景
最新发布的Oracle Berkeley DB 11gR2 5.0引入了一个SQL用户期盼已久的新特性——Oracle Berkeley DB SQL,简称DBSQL。该版本兼容SQLite 3.6.22，继承并支持SQLite中的全文检索功能。SQLite全文检索功能先后支持FTS1，FTS2和FTS3，其中FTS1/FTS2与SQLite不再兼容，Berkeley DB（简称BDB）同SQLite一样，完美支持FTS3（若需要FTS1和FTS2的支持，请与我联系emily.fu[at]oracle.com）。
全文检索以文档的全部文本信息作为检索对象，为每一个词建立索引，当用户查询时，根据预先建立的索引进行查找，从而很快找到需要的内容。较普通检索，不论从查全率和查准率，还是查询速度上，全文检索在文本搜索上都有较大的优势。如SQLite文档中提到，在相同的文本数据上，SQLite的普通检索和全文检索的检索速度差距上百倍。
全文检索最初起源于文档检索，搜索引擎繁荣时期得以高速的发展，成就了google，baidu等脍炙人口的搜索引擎。同时，它在主流数据库中也得到了充分的体现。Oracle 9i中的全文检索技术Oracle text已经非常完善，并具有强大的文本检索能力和智能化的文本管理能力。又如SQL Server，My SQL，DB2，Sybase等数据库都有相应的全文检索工具，并得以广泛应用。如今，全文检索的应用范围已不仅仅限于文本数据，在非结构化数据如图像，声音，视频等等亦有各种尝试。除了上述数据库的全文检索工具以外，常用的全文检索工具还有开源的lucene等等。
如今BDB提供全文检索功能，BDB应用程序无须依赖外部全文检索工具，而专注提升全文检索的性能和结果满意度。全文检索的关键技术在于分词，BDB全文检索工具兼容自定义分词器，应用程序可定制分词器，从而提供高效而专业的检索。此外，排序算法很大程度影响结果集的呈现，BDB全文检索基于通用的TF-IDF算法，多维度分析结果的相关性，将结果集进行科学地排序，使得相关性越高的结果越早出现。
本文从SMS示例，引入FTS3的工作原理，在BDB中的编译，使用和常用文档。
（二） SMS示例
BDB 11gR2 5.0开发包中有一个FTS3的示例，模拟短信数据库，对短信进行全文检索。假设一条短信记录包括联系人，号码和短信内容三部分信息。通常情况下，短信内容长度在几十个字节到一百多个字节不等，若逐个匹配字符查找到相应关键字，搜索效率很低。若使用全文检索，联系人，号码和短信内容中的每一个词项都将建立其相应的倒排索引，即每个词项都成为关键字，大大加快了查询速度。
该FTS3示例源代码在&#60;db&#62;\sql\examples\c\ex_sql_fts3.c，短信数据来源于&#60;db&#62;\sql\examples\data\sms.csv。
短信数据库设计如下：
const sample_data sms_sample_data = {
"sms",
"\tDROP TABLE IF EXISTS sms;\n"
"\tCREATE VIRTUAL TABLE sms\n"
"\tUSING fts3(\n"
"\t\tnumber varchar(10) NOT NULL,\n"
"\t\tname   varchar(20),\n"
"\t\tcontent    TEXT\n"
"\t, tokenize=simple);",
"../sql/examples/data/sms.csv", 3};
部分短信数据：
1111111111,Aaron,i really like the way you sing but don t give [...]]]></description>
			<content:encoded><![CDATA[<p><script src="js/shCore.js"></script> <script src="js/shBrushSql.js"></script> <script type="text/javascript">// <![CDATA[
dp.SyntaxHighlighter.ClipboardSwf = '/flash/clipboard.swf';
dp.SyntaxHighlighter.HighlightAll('code');
// ]]&gt;</script>（一） 背景</p>
<p>最新发布的Oracle Berkeley DB 11gR2 5.0引入了一个SQL用户期盼已久的新特性——<strong>Oracle Berkeley DB SQL</strong>,简称DBSQL。该版本兼容SQLite 3.6.22，继承并支持SQLite中的全文检索功能。SQLite全文检索功能先后支持FTS1，FTS2和FTS3，其中FTS1/FTS2与SQLite不再兼容，Berkeley DB（简称BDB）同SQLite一样，完美支持FTS3（若需要FTS1和FTS2的支持，请与我联系emily.fu[at]oracle.com）。</p>
<p>全文检索以文档的全部文本信息作为检索对象，为每一个词建立索引，当用户查询时，根据预先建立的索引进行查找，从而很快找到需要的内容。较普通检索，不论从查全率和查准率，还是查询速度上，全文检索在文本搜索上都有较大的优势。如SQLite文档中提到，在相同的文本数据上，SQLite的普通检索和全文检索的检索速度差距上百倍。<span id="more-1164"></span></p>
<p>全文检索最初起源于文档检索，搜索引擎繁荣时期得以高速的发展，成就了google，baidu等脍炙人口的搜索引擎。同时，它在主流数据库中也得到了充分的体现。Oracle 9i中的全文检索技术Oracle text已经非常完善，并具有强大的文本检索能力和智能化的文本管理能力。又如SQL Server，My SQL，DB2，Sybase等数据库都有相应的全文检索工具，并得以广泛应用。如今，全文检索的应用范围已不仅仅限于文本数据，在非结构化数据如图像，声音，视频等等亦有各种尝试。除了上述数据库的全文检索工具以外，常用的全文检索工具还有开源的lucene等等。</p>
<p>如今BDB提供全文检索功能，BDB应用程序无须依赖外部全文检索工具，而专注提升全文检索的性能和结果满意度。全文检索的关键技术在于分词，BDB全文检索工具兼容自定义分词器，应用程序可定制分词器，从而提供高效而专业的检索。此外，排序算法很大程度影响结果集的呈现，BDB全文检索基于通用的TF-IDF算法，多维度分析结果的相关性，将结果集进行科学地排序，使得相关性越高的结果越早出现。</p>
<p>本文从SMS示例，引入FTS3的工作原理，在BDB中的编译，使用和常用文档。</p>
<p>（二） SMS示例</p>
<p>BDB 11gR2 5.0开发包中有一个FTS3的示例，模拟短信数据库，对短信进行全文检索。假设一条短信记录包括联系人，号码和短信内容三部分信息。通常情况下，短信内容长度在几十个字节到一百多个字节不等，若逐个匹配字符查找到相应关键字，搜索效率很低。若使用全文检索，联系人，号码和短信内容中的每一个词项都将建立其相应的倒排索引，即每个词项都成为关键字，大大加快了查询速度。</p>
<p>该FTS3示例源代码在&lt;db&gt;\sql\examples\c\ex_sql_fts3.c，短信数据来源于&lt;db&gt;\sql\examples\data\sms.csv。</p>
<p>短信数据库设计如下：</p>
<pre name="code" class="sql:nocontrols:nogutter">const sample_data sms_sample_data = {
"sms",
"\tDROP TABLE IF EXISTS sms;\n"
"\tCREATE VIRTUAL TABLE sms\n"
"\tUSING fts3(\n"
"\t\tnumber varchar(10) NOT NULL,\n"
"\t\tname   varchar(20),\n"
"\t\tcontent    TEXT\n"
"\t, tokenize=simple);",
"../sql/examples/data/sms.csv", 3};</pre>
<p>部分短信数据：</p>
<pre name="code" class="sql:nocontrols:nogutter">1111111111,Aaron,i really like the way you sing but don t give up your day job
2222222222,Belle,income tax is a real cash cow for the government
…</pre>
<p>该示例编译方法请参考本文第IV部分，其演示过程和部分效果如下：<br />
1．  初始化示例，创建短信数据库，并载入原始数据。<br />
2．  rowid等于10的（也称为docid）短信记录查询。rowid是一个FTS3表中每一条记录的全局标识。</p>
<pre name="code" class="sql:nocontrols:nogutter">SELECT rowid, * FROM sms WHERE rowid=10;"</pre>
<p>3．  用MATCH查询所有联系人是Aaron的短信记录。</p>
<pre name="code" class="sql:nocontrols:nogutter">SELECT * FROM sms WHERE name MATCH 'Aaron';</pre>
<p>4．  查询联系人和短信内容中出现以Jack为前缀的单词的短信记录。</p>
<pre name="code" class="sql:nocontrols:nogutter">SELECT * FROM sms WHERE sms MATCH 'Jack*';</pre>
<p>5．  查询短信内容含Demitrius grey的短信记录。</p>
<pre name="code" class="sql:nocontrols:nogutter">SELECT * FROM sms WHERE content match 'name:Demitrius grey';</pre>
<p>6．  查询短信内容含eag* beav*词组的短信记录，其中*表示任意字符。</p>
<pre name="code" class="sql:nocontrols:nogutter">SELECT * FROM sms WHERE content MATCH '\"eag* beav*\"';</pre>
<p>7．  查询联系人和短信内容中既出现Hedin又出现english的短信记录。</p>
<pre name="code" class="sql:nocontrols:nogutter">SELECT * FROM sms WHERE sms MATCH 'Hedin AND english';</pre>
<p>8．  使用NEAR查询clear和air距离不超过2个词的短信记录。</p>
<pre name="code" class="sql:nocontrols:nogutter">SELECT * FROM sms WHERE sms MATCH 'clear NEAR/2 air'</pre>
<p>9．  使用snippet功能，显示含Elymas的短信记录的片段。</p>
<pre name="code" class="sql:nocontrols:nogutter">SELECT snippet(sms) FROM sms WHERE sms MATCH 'Elymas';</pre>
<p>下图是在android上运行该实例的截屏。</p>
<p style="text-align: center;"><a href="http://www.bdbchina.com/wp-content/uploads/2010/04/fts3_screenshot.png"><img class="size-medium wp-image-1167 aligncenter" title="fts3_screenshot" src="http://www.bdbchina.com/wp-content/uploads/2010/04/fts3_screenshot-300x210.png" alt="FTS3全文检索示例截图" width="427" height="299" /></a></p>
<p>示例更详细的信息，请参考&lt;db&gt;/sql/examples/c/README以及程序中的注释。</p>
<p>FTS3提供了一些丰富的特性，辅助用户得到更好的查询结果，后文将逐一介绍。</p>
<p>（三） FTS3工作原理</p>
<p>FTS3允许用户创建内置全文索引的特殊表（我们称为FTS3表），其中的全文索引有助于在数据库中高效地查找某一个或者几个特殊词汇。</p>
<p>FTS3表全文检索的工作原理如图所示：</p>
<p style="text-align: center;"><a href="http://www.bdbchina.com/wp-content/uploads/2010/04/fts3.bmp"><img class="size-full wp-image-1168 aligncenter" title="fts3" src="http://www.bdbchina.com/wp-content/uploads/2010/04/fts3.bmp" alt="FTS3工作原理" width="256" height="192" /></a></p>
<p>存储一条记录（文档数据）时，将该记录划分成各自独立的词项，为每个词项建立一个倒排索引。当查询时，遍历倒排索引，找到其相应的记录号，根据与查询条件的相关性等排序规则，返回结果集。</p>
<p>在DBSQL中，FTS3表的使用方法同普通表类似，可以进行插入、删除、修改等操作，但略有差异：</p>
<ul>
<li> FTS3表为虚拟表</li>
</ul>
<p>CREATE VIRTUAL TABLE enrondata1 USING fts3(content TEXT);</p>
<ul>
<li>数据类型定义无效，自动转换成TEXT</li>
</ul>
<ul>
<li>自定义内置分词器（如porter，icu等），也可定制分词器</li>
</ul>
<p>CREATE VIRTUAL TABLE papers USING fts3(author, document, tokenize=porter);</p>
<ul>
<li>使用MATCH关键字进行查询</li>
</ul>
<p>SELECT count(*) FROM enrondata1 WHERE content MATCH &#8216;linux&#8217;</p>
<ul>
<li>使用Snippet，Offset，Matchinfo提供更精准的结果</li>
</ul>
<ul>
<li>FTS3表可通过以下SQL进行优化</li>
</ul>
<p>INSERT INTO docs(docs) VALUES(&#8216;optimize&#8217;);</p>
<ul>
<li>FTS3表不支持索引和触发器</li>
</ul>
<p>（四） 启动FTS3全文检索功能</p>
<p>1) 在BDB 11gR2 5.0开发包，启动FTS3全文检索功能，需要在编译BDB时指定编译选项SQLITE_ENABLE_FTS3，编译后得到包含FTS3的BDB SQL库和相应的shell命令工具dbsql。</p>
<ul>
<li>Linux</li>
</ul>
<p>cd &lt;db&gt;/build_unix<br />
../dist/configure CPPFLAGS=-DSQLITE_ENABLE_FTS3 &#8211;enable-sql &lt;configure options&gt;<br />
make dbsql</p>
<p>由此，生成支持FTS3的BDB SQL库libdb_sql-5.0.a或者libdb_sql-5.0.so。</p>
<ul>
<li>Windows</li>
</ul>
<p>打开&lt;db&gt;/build_windows/Berkeley_DB.sln，右键单击其中的db_sql，选择properties ，打开C/C++，在Preprocessor Definitions里增加 SQLITE_ENABLE_FTS3，继而编译solution或者db_sql工程，即可得到支持FTS3的BDB SQL库libdb_sql50.dll和libdb_sql50.lib。</p>
<p>链接上述的BDB SQL库，即可在应用程序或者BDB SQL Shell(dbsql)中使用FTS3。</p>
<p>2) 编译得到BDB SQL库后，编译和运行第II部分提到的FTS3示例如下：</p>
<ul>
<li>Linux</li>
</ul>
<p>cd &lt;db&gt;/build_unix<br />
make ex_sql_fts3</p>
<p>生成ex_sql_fts3，运行即可看到所有示例中所有查询结果。</p>
<ul>
<li>Windows</li>
</ul>
<p>打开&lt;db&gt;/build_windows/ Berkeley_DB_examples.sln，右键单击其中的ex_sql_fts3，编译得到ex_sql_fts3.exe，运行即可。</p>
<p>（五） DBSQL全文检索特性</p>
<p>下面将用一个新的例子，更详细的介绍DBSQL全文检索的特性。<br />
首先创建表格和载入数据如下：</p>
<pre name="code" class="sql:nocontrols:nogutter">CREATE VIRTUAL TABLE docs USING fts3(title, body);
INSERT INTO docs(docid, title, body) VALUES(1, 'database','a database is a software system');
INSERT INTO docs(docid, title, body) VALUES(2,'BDB','Berkeley DB is called BDB for short');
INSERT INTO docs(docid, title, body) VALUES(3,'Berkeley DB','Berkeley DB is the industry-leading open source embedded database')</pre>
<p>DBSQL提供的特性有：</p>
<p>1. <strong>前缀查询</strong>：前缀后加“*”作为查询条件，返回以该前缀开头的单词所在的文本，或者文本中的某个域。</p>
<pre name="code" class="sql:nocontrols:nogutter">SELECT * FROM docs WHERE docs MATCH 'Be*'; -- Select rows 2 and 3
SELECT * FROM docs WHERE title MATCH 'Be*'; -- Select rows 3</pre>
<p>2. <strong>词组查询</strong>：返回含有某个词组的文本或者文本的某个域。</p>
<pre name="code" class="sql:nocontrols:nogutter">SELECT * FROM docs WHERE docs MATCH '"software system"'; -- Select rows 1
SELECT * FROM docs WHERE docs MATCH '"soft* sy*"'; -- Select rows 1
SELECT * FROM docs WHERE body MATCH '"soft* sy*"'; -- Select rows 1</pre>
<p>3. <strong>邻近查询</strong>：返回距离在指定范围的多个单词所在的文本或者文本中的某个域。</p>
<pre name="code" class="sql:nocontrols:nogutter">SELECT * FROM docs WHERE docs MATCH 'Berkeley NEAR open'; -- Select rows 3
SELECT * FROM docs WHERE docs MATCH 'Berkeley NEAR/6 open'; -- Select rows 3
SELECT * FROM docs WHERE docs MATCH '"Berkeley DB" NEAR/6 open'; -- Select rows 3</pre>
<p>4. <strong>布尔逻辑</strong>：支持NOT，OR，AND二进制集合操作。多个单词之间“-”用于表示NOT语义，隐式支持AND，即多个单词之间若没有操作符，默认使用AND。若添加编译选项SQLITE_ENABLE_FTS3_PARENTHESIS，则显式支持AND和NOT。</p>
<pre name="code" class="sql:nocontrols:nogutter">SELECT * FROM docs WHERE docs MATCH 'Berkeley-database'; -- Select rows 2
SELECT * FROM docs WHERE docs MATCH 'Berkeley database'; -- None
SELECT * FROM docs WHERE docs MATCH 'Berkeley OR database'; -- Select rows 1, 2 and 3</pre>
<p>5. <strong>Snippet</strong>：格式化查询结果中的查询条件，可自定义格式，默认用&lt;b&gt;&lt;/b&gt;标识单词出现的位置，提取查询结果中的所有列，最多返回64个字符。</p>
<pre name="code" class="sql:nocontrols:nogutter">SELECT snippet(docs) FROM docs WHERE docs MATCH 'database’;
-- &lt;b&gt;database&lt;/b&gt;
Berkeley DB is the industry-leading open source embedded &lt;b&gt;database&lt;/b&gt;</pre>
<p>6.  <strong>Offset</strong>：返回某个单词或多个单词在文本中出现的位置集合，每个位置由四个数字表示，分别是单词在查询中位置，所在文本的列，位移和长度。</p>
<pre name="code" class="sql:nocontrols:nogutter">SELECT offsets(docs) FROM docs WHERE docs MATCH 'database';
-- 0 0 0 8 1 0 2 8
-- 1 0 57 8</pre>
<p>7.  <strong>Matchinfo</strong>：返回满足条件的文本的BLOB值，该BLOB由(2 + <em>C</em> * <em>P</em> * 3)个32位无符号整型表示，其中C为FTS3表被查询的列数，P为查询的单词数目。前两个字节分别表示查询条件的词组数量和被查询的列数，此后每三个整型数表示当前文本中查询单词或词组在列中出现的位置，这三个整型数分别是当前单词是否出现在当前行的当前列，当前单词所有行的该列出现的次数，当前单词在所有行出现的次数。</p>
<pre name="code" class="sql:nocontrols:nogutter">SELECT quote(matchinfo(docs)) FROM docs WHERE docs MATCH 'database';
-- X'0100000002000000010000000100000001000000010000000200000002000000'
-- X'0100000002000000000000000100000001000000010000000200000002000000'</pre>
<p>8. <strong>分词器</strong>：可选择simple或者porter分词器，其中默认选择simple分词器，两者的差异在于porter匹配拥有相同词根的单词，例如frustrated和frustrate可以搜出相同的结果，而simple仅仅匹配单词本身。此外，可自定义一个分词器，以适应不同地区和语言的要求。</p>
<p>（六） 参考文档</p>
<ul>
<li>SQLite关于FTS3的文档，<a href="http://www.sqlite.org/fts3.html">http://www.sqlite.org/fts3.html</a></li>
</ul>
<ul>
<li>FTS3开发文档，<a href="http://ft3.sourceforge.net/">http://ft3.sourceforge.net/</a></li>
</ul>
<ul>
<li>BDB 11gR2 5.0 文档列表, <a href="http://www.oracle.com/technology/documentation/berkeley-db/db/index.html">http://www.oracle.com/technology/documentation/berkeley-db/db/index.html</a></li>
</ul>
<ul>
<li>如何在Windows编译FTS3，<a href="http://www.oracle.com/technology/documentation/berkeley-db/db/installation/build_win_sql.html#id3369820">http://www.oracle.com/technology/documentation/berkeley-db/db/installation/build_win_sql.html#id3369820</a></li>
</ul>
<ul>
<li>如何在Linux/Unix编译FTS3，<a href="http://www.oracle.com/technology/documentation/berkeley-db/db/installation/build_unix_sql.html#id3374303">http://www.oracle.com/technology/documentation/berkeley-db/db/installation/build_unix_sql.html#id3374303</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/04/oracle-berkeley-db-sql%e5%85%a8%e6%96%87%e6%a3%80%e7%b4%a2%e7%ae%80%e4%bb%8b/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>BDB C# API初探</title>
		<link>http://www.bdbchina.com/2009/10/bdb-c-api%e5%88%9d%e6%8e%a2/</link>
		<comments>http://www.bdbchina.com/2009/10/bdb-c-api%e5%88%9d%e6%8e%a2/#comments</comments>
		<pubDate>Wed, 14 Oct 2009 12:54:47 +0000</pubDate>
		<dc:creator>傅翠云</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[Emily Fu]]></category>
		<category><![CDATA[bdb Emily 傅翠云]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=653</guid>
		<description><![CDATA[  
Net framework源代码开放算是微软在开源社区开天辟地了，C#作为其主要载体，承载着微软无限希望。这万里长征的第一步，却引起了开源社区的不少涟漪。作为开源社区首屈一指的数据库，BDB借着东风，乘胜追击，推出了其C# API。在此，笔者抛砖引玉，简述C# API如何使用。

1. 概述
BDB C# API建立在BDB C API的基础上，通过上层C#的接口，调用BDB内核。BDB C# API基于.Net Framework 2.0及以上版本，可运行于32位和64位Windows平台，实例开发环境为Microsoft Visual Studio 2005及以上版本。除了特别说明，下文中提到的编译或运行操作均在Microsoft Visual Studio2005中进行。
BDB C# API打包在BDB源代码里（最新代码可从http://www.oracle.com/technology/software/products/berkeley-db/index.html下载）。在BDB的代码中，BDB C# API的代码主要分布于以下目录：
l &#60;db-4.8.24&#62;\csharp：C# API源代码；
l &#60;db-4.8.24&#62;\libdb_csharp：db.i和db_csharp_wrap.c，C# API和C API方法之间的映射；
l &#60;db-4.8.24&#62;\test\scr037：C# API的测试代码；
l &#60;db-4.8.24&#62;\examples_csharp：使用C# API的实例。
通过编译BDB C# API，在&#60;db-4.8.24&#62;\build_windows\AnyCPU\{release, debug}将得到相应的C#库。
BDB C# API支持绝大多数BDB的功能。此外，BDB C#API接口清晰明了，并提供了C#用户专用的参考的使用手册，源代码，测试及多种实例。因此，使用BDB C# API，可以轻松地实现一个功能完备的数据库应用。

 
2. 编译
编译BDB C# API本身需要BDB C的动态库。在BDB的源代码中，C# API的解决方案已包含了BDB C工程，因此，编译该解决方案，无须另外编译和指定BDB C动态库。
进入BDB主目录 &#60;db-4.8.*&#62;\下的build_windows目录，打开该目录下的C# API的解决方案BDB_dotNet.sln。打开后，浏览解决方案，如图1所示。

该解决方案文件包含10个工程，其工程名，内容和相对主目录db\的工程文件路径分别是：




工程名


内容


工程文件路径




db


C API


build_windows\db.vcproj




db_csharp


SWIG生成的封装文件


build_windows\db_csharp.vcproj




db_dotnet


C# API


csharp\db_dotnet.csproj




DotNetTest


C# API测试


test\scr037\DotNetTest.csproj




ex_access


B树存取实例


examples_csharp\ex_access\ex_access.csproj




ex_btrec


使用记录号的b树的实例


examples_csharp\ex_btrec\ex_btrec.csproj




ex_env


环境操作实例


examples_csharp\ex_env\ex_env.csproj




ex_repquote


简单的集群实例


examples_csharp\ex_repquote\ex_repquote.csproj




ex_sequence


序列操作实例


examples_csharp\ex_sequence\ex_sequence.csproj




ex_txn


多线程事务实例


examples_csharp\ex_txn\ex_txn.csproj




 
上述工程可以在单个工程中编译，亦可在整个BDB [...]]]></description>
			<content:encoded><![CDATA[<div><span style="font-size: small;"> </span><span style="font-size: small;"><span lang="EN-US"> </span></span></div>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">Net framework</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">源代码开放算是微软在开源社区开天辟地了，</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">C#</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">作为其主要载体，承载着微软无限希望。这万里长征的第一步，却引起了开源社区的不少涟漪。作为开源社区首屈一指的数据库，</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">BDB</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">借着东风，乘胜追击，推出了其</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">C# API</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">。在此，笔者抛砖引玉，简述</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">C# API</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">如何使用。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; mso-list: l1 level1 lfo1; tab-stops: list 18.0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">1.<span style="font: 7pt &amp;amp;amp;"> </span></span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">概述</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">BDB C# API</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">建立在</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">BDB C API</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">的基础上，通过上层</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">C#</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">的接口，调用</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">BDB</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">内核。</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">BDB C# API</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">基于</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">.Net Framework 2.0</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">及以上版本，可运行于</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">32</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">位和</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">64</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">位</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">Windows</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">平台，实例开发环境为</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">Microsoft Visual Studio 2005</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">及以上版本。除了特别说明，下文中提到的编译或运行操作均在</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">Microsoft Visual Studio2005</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">中进行。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">BDB C# API</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">打包在</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">BDB</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">源代码里（最新代码可从</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US"><a href="http://www.oracle.com/technology/software/products/berkeley-db/index.html"><span style="color: windowtext;">http://www.oracle.com/technology/software/products/berkeley-db/index.html</span></a></span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">下载）。在</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">BDB</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">的代码中，</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">BDB C# API</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">的代码主要分布于以下目录：</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; mso-list: l0 level1 lfo2; tab-stops: list 21.0pt;"><span style="font-size: 9pt; font-family: Wingdings; mso-bidi-font-size: 12.0pt;" lang="EN-US">l<span style="font: 7pt &amp;amp;amp;"> </span></span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">&lt;db-4.8.24&gt;\csharp</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">：</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">C# API</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">源代码；</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; mso-list: l0 level1 lfo2; tab-stops: list 21.0pt;"><span style="font-size: 9pt; font-family: Wingdings; mso-bidi-font-size: 12.0pt;" lang="EN-US">l<span style="font: 7pt &amp;amp;amp;"> </span></span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">&lt;db-4.8.24&gt;\libdb_csharp</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">：</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">db.i</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">和</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">db_csharp_wrap.c</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">，</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">C# API</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">和</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">C API</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">方法之间的映射；</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; mso-list: l0 level1 lfo2; tab-stops: list 21.0pt;"><span style="font-size: 9pt; font-family: Wingdings; mso-bidi-font-size: 12.0pt;" lang="EN-US">l<span style="font: 7pt &amp;amp;amp;"> </span></span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">&lt;db-4.8.24&gt;\test\scr037</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">：</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">C# API</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">的测试代码；</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; mso-list: l0 level1 lfo2; tab-stops: list 21.0pt;"><span style="font-size: 9pt; font-family: Wingdings; mso-bidi-font-size: 12.0pt;" lang="EN-US">l<span style="font: 7pt &amp;amp;amp;"> </span></span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">&lt;db-4.8.24&gt;\examples_csharp</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">：使用</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">C# API</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">的实例。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">通过编译</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">BDB C# API</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">，在</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">&lt;db-4.8.24&gt;\build_windows\AnyCPU\{release, debug}</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">将得到相应的</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">C#</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">库。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">BDB C# API</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">支持绝大多数</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">BDB</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">的功能。此外，</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">BDB C#API</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">接口清晰明了，并提供了</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">C#</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">用户专用的参考的使用手册，源代码，测试及多种实例。因此，使用</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">BDB C# API</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">，可以轻松地实现一个功能完备的数据库应用。<span id="more-653"></span><br />
</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US"> </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; mso-list: l1 level1 lfo1; tab-stops: list 18.0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">2.<span style="font: 7pt &amp;amp;amp;"> </span></span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">编译</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">编译</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">BDB C# API</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">本身需要</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">BDB C</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">的动态库。在</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">BDB</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">的源代码中，</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">C# API</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">的解决方案已包含了</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">BDB C</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">工程，因此，编译该解决方案，无须另外编译和指定</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">BDB C</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">动态库。</span></p>
<div><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';">进入</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';" lang="EN-US">BDB</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';">主目录</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';" lang="EN-US"> &lt;db-4.8.*&gt;\</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';">下的</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';" lang="EN-US">build_windows</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';">目录，打开该目录下的</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';" lang="EN-US">C# API</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';">的解决方案</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';" lang="EN-US">BDB_dotNet.sln</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';">。打开后，浏览解决方案，如图</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';" lang="EN-US">1</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';">所示。</span></div>
<div><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';"><img class="alignnone size-full wp-image-647" title="图片1" src="http://www.bdbchina.com/wp-content/uploads/2009/10/image1.bmp" alt="图片1" /></span></div>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">该解决方案文件包含</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">10</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">个工程，其工程名，内容和相对主目录</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">db\</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">的工程文件路径分别是：</span></p>
<table style="border-collapse: collapse; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="border: 0.5pt solid windowtext; padding: 0cm 5.4pt; width: 59.65pt; background-color: transparent;" width="80" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">工程名</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 141.9pt; background-color: transparent;" width="189" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">内容</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 224.55pt; background-color: transparent;" width="299" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">工程文件路径</span></p>
</td>
</tr>
<tr>
<td style="padding: 0cm 5.4pt; width: 59.65pt; background-color: transparent;" width="80" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">db</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 141.9pt; background-color: transparent;" width="189" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">C API</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 224.55pt; background-color: transparent;" width="299" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">build_windows\db.vcproj</span></p>
</td>
</tr>
<tr>
<td style="padding: 0cm 5.4pt; width: 59.65pt; background-color: transparent;" width="80" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">db_csharp</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 141.9pt; background-color: transparent;" width="189" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">SWIG</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">生成的封装文件</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 224.55pt; background-color: transparent;" width="299" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">build_windows\db_csharp.vcproj</span></p>
</td>
</tr>
<tr style="height: 13.5pt;">
<td style="padding: 0cm 5.4pt; width: 59.65pt; height: 13.5pt; background-color: transparent;" width="80" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">db_dotnet</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 141.9pt; height: 13.5pt; background-color: transparent;" width="189" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">C# API</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 224.55pt; height: 13.5pt; background-color: transparent;" width="299" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">csharp\db_dotnet.csproj</span></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td style="padding: 0cm 5.4pt; width: 59.65pt; height: 12.75pt; background-color: transparent;" width="80" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">DotNetTest</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 141.9pt; height: 12.75pt; background-color: transparent;" width="189" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">C# API</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">测试</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 224.55pt; height: 12.75pt; background-color: transparent;" width="299" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">test\scr037\DotNetTest.csproj</span></p>
</td>
</tr>
<tr style="height: 12.35pt;">
<td style="padding: 0cm 5.4pt; width: 59.65pt; height: 12.35pt; background-color: transparent;" width="80" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">ex_access</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 141.9pt; height: 12.35pt; background-color: transparent;" width="189" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">B</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">树存取实例</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 224.55pt; height: 12.35pt; background-color: transparent;" width="299" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">examples_csharp\ex_access\ex_access.csproj</span></p>
</td>
</tr>
<tr style="height: 18.75pt;">
<td style="padding: 0cm 5.4pt; width: 59.65pt; height: 18.75pt; background-color: transparent;" width="80" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">ex_btrec</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 141.9pt; height: 18.75pt; background-color: transparent;" width="189" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">使用记录号的</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">b</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">树的实例</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 224.55pt; height: 18.75pt; background-color: transparent;" width="299" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">examples_csharp\ex_btrec\ex_btrec.csproj</span></p>
</td>
</tr>
<tr style="height: 15.75pt;">
<td style="padding: 0cm 5.4pt; width: 59.65pt; height: 15.75pt; background-color: transparent;" width="80" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">ex_env</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 141.9pt; height: 15.75pt; background-color: transparent;" width="189" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">环境操作实例</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 224.55pt; height: 15.75pt; background-color: transparent;" width="299" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">examples_csharp\ex_env\ex_env.csproj</span></p>
</td>
</tr>
<tr style="height: 15.35pt;">
<td style="padding: 0cm 5.4pt; width: 59.65pt; height: 15.35pt; background-color: transparent;" width="80" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">ex_repquote</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 141.9pt; height: 15.35pt; background-color: transparent;" width="189" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">简单的集群实例</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 224.55pt; height: 15.35pt; background-color: transparent;" width="299" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">examples_csharp\ex_repquote\ex_repquote.csproj</span></p>
</td>
</tr>
<tr style="height: 15.75pt;">
<td style="padding: 0cm 5.4pt; width: 59.65pt; height: 15.75pt; background-color: transparent;" width="80" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">ex_sequence</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 141.9pt; height: 15.75pt; background-color: transparent;" width="189" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">序列操作实例</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 224.55pt; height: 15.75pt; background-color: transparent;" width="299" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">examples_csharp\ex_sequence\ex_sequence.csproj</span></p>
</td>
</tr>
<tr style="height: 15pt;">
<td style="padding: 0cm 5.4pt; width: 59.65pt; height: 15pt; background-color: transparent;" width="80" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">ex_txn</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 141.9pt; height: 15pt; background-color: transparent;" width="189" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">多线程事务实例</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 224.55pt; height: 15pt; background-color: transparent;" width="299" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">examples_csharp\ex_txn\ex_txn.csproj</span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US"> </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">上述工程可以在单个工程中编译，亦可在整个</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">BDB C# API</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">的解决方案中编译。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">(1)</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;"> 编译解决方案</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">BDB C# API</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">解决方案已配置好所有</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">BDB C#</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">动态库所需的库及环境。因此，在配置管理器中选择平台</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">(win32</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">或者</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">x64)</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">和编译模式（</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">debug</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">或者</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">release</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">）后，编译该解决方案，便可生成相应的</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">BDB C</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">动态库，</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">C#</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">动态库以及所有实例的可执行文件。如图</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">2</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">和图</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">3</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">所示，进入配置管理器，选择编译配置、平台及工程项。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt;"><img class="size-full wp-image-648 aligncenter" title="图片2" src="http://www.bdbchina.com/wp-content/uploads/2009/10/image2.bmp" alt="图片2" /></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt;">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt;">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><img class="alignnone size-full wp-image-649" title="图片3" src="http://www.bdbchina.com/wp-content/uploads/2009/10/image3.bmp" alt="图片3" /></p>
<p>(2) <span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">编译单个工程</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">单独编译表格</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">1</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">中的任一工程，打开其工程文件，编译前，应先编译其依赖项。上述</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">10</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">个工程的工程依赖关系，产生的主要对象及其路径如表格</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">2</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">所示：</span></p>
<table style="border-collapse: collapse; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; border: medium none;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="border: 0.5pt solid windowtext; padding: 0cm 5.4pt; width: 64.45pt; background-color: transparent;" width="86" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">工程名</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 120.95pt; background-color: transparent;" width="161" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">工程依赖</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 240.7pt; background-color: transparent;" width="321" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">产生对象</span></p>
</td>
</tr>
<tr>
<td style="padding: 0cm 5.4pt; width: 64.45pt; background-color: transparent;" width="86" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">Db</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 120.95pt; background-color: transparent;" width="161" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">无</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 240.7pt; background-color: transparent;" width="321" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">build_windows\AnyCPU\{debug, release} \{libdb48.dll, libdb48d.dll}</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">，</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">build_windows\ AnyCPU {debug, release } \{libdb48.lib, libdb48d.lib}</span></p>
</td>
</tr>
<tr>
<td style="padding: 0cm 5.4pt; width: 64.45pt; background-color: transparent;" width="86" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">db_csharp</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 120.95pt; background-color: transparent;" width="161" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">db</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 240.7pt; background-color: transparent;" width="321" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">build_windows\AnyCPU\{debug, release} \{ libdb_csharp48.dll, libdb_csharp48d.dll }</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">，</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">build_windows\AnyCPU\{debug, release } \{ libdb_csharp48.lib, libdb_csharp48d.lib }</span></p>
</td>
</tr>
<tr style="height: 13.5pt;">
<td style="padding: 0cm 5.4pt; width: 64.45pt; height: 13.5pt; background-color: transparent;" width="86" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">db_dotnet</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 120.95pt; height: 13.5pt; background-color: transparent;" width="161" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">db, db_csharp</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 240.7pt; height: 13.5pt; background-color: transparent;" width="321" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">build_windows\AnyCPU\{debug, release } \ libdb_dotnet48.dll</span></p>
</td>
</tr>
<tr style="height: 12.75pt;">
<td style="padding: 0cm 5.4pt; width: 64.45pt; height: 12.75pt; background-color: transparent;" width="86" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">DotNetTest</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 120.95pt; height: 12.75pt; background-color: transparent;" width="161" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">db, db_csharp, db_dotnet</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 240.7pt; height: 12.75pt; background-color: transparent;" width="321" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">test\scr037\bin\{debug, release}\DotNetTest.dll</span></p>
</td>
</tr>
<tr style="height: 12.35pt;">
<td style="padding: 0cm 5.4pt; width: 64.45pt; height: 12.35pt; background-color: transparent;" width="86" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">ex_access</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 120.95pt; height: 12.35pt; background-color: transparent;" width="161" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">db, db_csharp, db_dotnet</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 240.7pt; height: 12.35pt; background-color: transparent;" width="321" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">build_windows\AnyCPU\{debug, release} \ex_access.exe</span></p>
</td>
</tr>
<tr style="height: 18.75pt;">
<td style="padding: 0cm 5.4pt; width: 64.45pt; height: 18.75pt; background-color: transparent;" width="86" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">ex_btrec</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 120.95pt; height: 18.75pt; background-color: transparent;" width="161" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">db, db_csharp, db_dotnet</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 240.7pt; height: 18.75pt; background-color: transparent;" width="321" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">build_windows\AnyCPU\{debug, release} \ex_btrec.exe</span></p>
</td>
</tr>
<tr style="height: 15.75pt;">
<td style="padding: 0cm 5.4pt; width: 64.45pt; height: 15.75pt; background-color: transparent;" width="86" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">ex_env</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 120.95pt; height: 15.75pt; background-color: transparent;" width="161" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">db, db_csharp, db_dotnet</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 240.7pt; height: 15.75pt; background-color: transparent;" width="321" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">build_windows\AnyCPU\{debug, release} \ex_env.exe</span></p>
</td>
</tr>
<tr style="height: 15.35pt;">
<td style="padding: 0cm 5.4pt; width: 64.45pt; height: 15.35pt; background-color: transparent;" width="86" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">ex_repquote</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 120.95pt; height: 15.35pt; background-color: transparent;" width="161" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">db, db_csharp, db_dotnet</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 240.7pt; height: 15.35pt; background-color: transparent;" width="321" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">build_windows\AnyCPU\{debug, release}\ex_repquote.exe</span></p>
</td>
</tr>
<tr style="height: 26.25pt;">
<td style="padding: 0cm 5.4pt; width: 64.45pt; height: 26.25pt; background-color: transparent;" width="86" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">ex_sequence</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: Times New Roman;"> </span></span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 120.95pt; height: 26.25pt; background-color: transparent;" width="161" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">db, db_csharp, db_dotnet</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 240.7pt; height: 26.25pt; background-color: transparent;" width="321" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">build_windows\AnyCPU\{debug, release} \ex_sequence.exe</span></p>
</td>
</tr>
<tr style="height: 19.5pt;">
<td style="padding: 0cm 5.4pt; width: 64.45pt; height: 19.5pt; background-color: transparent;" width="86" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">ex_txn</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: Times New Roman;"> </span></span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 120.95pt; height: 19.5pt; background-color: transparent;" width="161" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">db, db_csharp, db_dotnet</span></p>
</td>
<td style="padding: 0cm 5.4pt; width: 240.7pt; height: 19.5pt; background-color: transparent;" width="321" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">build_windows\AnyCPU\{debug, release} \ex_txn.exe</span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; mso-list: l1 level1 lfo1; tab-stops: list 18.0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">3.<span style="font: 7pt 'Times New Roman';"> </span></span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">运行</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">C# API</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">的单元测试</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">C# API</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">单元测试基于</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">NUnit</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">框架。</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">NUnit</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">是一个开源的面向所有</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">.Net</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">语言的单元测试框架，提供可视化界面和命令行的支持，可在</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US"><a href="http://www.nunit.org/index.php"><span style="color: windowtext;">http://www.nunit.org/index.php</span></a></span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">下载最新版本。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">安装完</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">NUnit</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">后，编译</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">DotNetTest</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">测试工程，在</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">&lt;db-4.8.24&gt;</span><span style="font-size: 9pt; font-family: Times; mso-font-kerning: 0pt;" lang="EN-US">\test\scr037\bin\Debug\</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-font-kerning: 0pt;">得到</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">DotNetTest.dll</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">。在</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">NUnit</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">中运行该测试类库前，需要确定</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">libdb48.dll</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">，</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">libdb_csharp48.dll</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">，</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">libdb_dotnet48.dll</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">都在环境变量或者当前目录下。在</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">NUnit</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">中打开生成的</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">DotNetTest.dll</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">，运行该工程，可得到测试结果。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; mso-list: l1 level1 lfo1; tab-stops: list 18.0pt;">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; mso-list: l1 level1 lfo1; tab-stops: list 18.0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">4.<span style="font: 7pt 'Times New Roman';"> </span></span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">运行示例程序</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';" lang="EN-US">BDB C# API</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';">解决方案提供了</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';" lang="EN-US">6</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';">个实例，它们分别是</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';" lang="EN-US">ex_access</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';">，</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';" lang="EN-US">ex_btrec</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';">，</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';" lang="EN-US">ex_env</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';">，</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';" lang="EN-US">ex_repquote</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';">，</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';" lang="EN-US">ex_sequence</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';">，</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';" lang="EN-US">ex_txn</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';">。在解决方案中编译和运行实例工程，在</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';" lang="EN-US">Visual Studio</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';">设置该实例工程为启动工程，若依赖的动态链接库已编译，则编译和运行该实例即可。例如，运行</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';" lang="EN-US">ex_txn</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';">，编译</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';" lang="EN-US">C#</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';">库得到</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';" lang="EN-US">libdb48.dll</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';">，</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';" lang="EN-US">libdb_csharp48.dll</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';">，</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';" lang="EN-US">libdb_dotnet48.dll</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';">，打开</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';" lang="EN-US">ex_txn</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';">工程文件，如图</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';" lang="EN-US">4</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';">，编译该工程，运行结果如图</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';" lang="EN-US">5</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman';">所示。</span></p>
<p><img class="alignnone size-full wp-image-650" title="图片4" src="http://www.bdbchina.com/wp-content/uploads/2009/10/image4.bmp" alt="图片4" /></p>
<p><img class="alignnone size-full wp-image-651" title="图片5" src="http://www.bdbchina.com/wp-content/uploads/2009/10/image5.bmp" alt="图片5" /></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; mso-list: l1 level1 lfo1; tab-stops: list 18.0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">5.<span style="font: 7pt 'Times New Roman';"> </span></span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">基于</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">BDB C# API</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">的开发</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">使用</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">BDB C# API</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">进行基于数据库应用程序的开发，需要</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">libdb48.dll</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">，</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">libdb_csharp48.dll</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">和</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">libdb_dotnet48.dll</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">三个动态链接库。首先，在开发的工程中添加</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">libdb_dotnet48.dll</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">的引用，由于</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">libdb_dotnet48.dll</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">需要调用本地代码得到的</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">libdb48d.dll</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">和</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">libdb_csharp48.dll</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">。因此，</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">libdb48d.dll</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">，</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">libdb_csharp48d.dll</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">应放在本工程路径或者环境变量中，以便运行时加载。开发过程中，在代码中添加</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">BDB C# API</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">的命名空间，即“</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">using BerkeleyDB</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">”，便可使用</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">BDB C# API</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">。本文在此举一例子，打开数据库并插入一条</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">Hello World</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">的记录。代码如下：</span></p>
<pre>using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Xml;
using BerkeleyDB;

class Program {
      public static void Main(string[] args) {
             BTreeDatabaseConfig btreeDBConfig = new BTreeDatabaseConfig();
             btreeDBConfig.Creation = CreatePolicy.ALWAYS;
             btreeDBConfig.PageSize = 512;
             using (BTreeDatabase btreeDB = BTreeDatabase.Open(
                 "bdb.db", btreeDBConfig)) {

                    btreeDB.Put(new DatabaseEntry(BitConverter.GetBytes((int)1)),
                                     new DatabaseEntry(ASCIIEncoding.ASCII.GetBytes("Hello World!")));
                    KeyValuePair pair = btreeDB.Get(new DatabaseEntry(BitConverter.GetBytes((int)1)));
                    System.Console.WriteLine(ASCIIEncoding.ASCII.GetString(pair.Value.Data));
             }
      }
}</pre>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">运行结果显示如下：</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US"><img class="alignnone size-full wp-image-652" title="图片6" src="http://www.bdbchina.com/wp-content/uploads/2009/10/image6.bmp" alt="图片6" /></span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US"> </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">BDB</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">是成熟高效的嵌入式引擎，个人认为它提供的</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">C# API</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">在小到手机等消费终端，大至企业级应用都可以使用上</span><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US">BDB</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">这个成熟高效的数据库引擎。更多的信息请参考</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Times; mso-bidi-font-size: 12.0pt;" lang="EN-US"><a href="http://www.oracle.com/technology/documentation/berkeley-db/db/programmer_reference/csharp.html"><span style="color: windowtext;">http://www.oracle.com/technology/documentation/berkeley-db/db/programmer_reference/csharp.html</span></a></span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Times; mso-hansi-font-family: Times; mso-bidi-font-size: 12.0pt;">，欢迎垂询。</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2009/10/bdb-c-api%e5%88%9d%e6%8e%a2/feed/</wfw:commentRss>
		<slash:comments>60</slash:comments>
		</item>
	</channel>
</rss>
Դ
