在数据库开发中,经常会遇到一些难以控制的黑箱技术,比如BDE(Borland Database Engine)。本文将展示如何在不使用BDE的情况下,直接操作Paradox数据库文件并读取数据,同时利用主索引查找特定记录。
开发者在面对技术黑箱时,往往希望能够打开它,进行调试、跟踪,甚至查看其内部结构。本文作者在寻找.NET原生的Paradox数据库读取器未果后,决定自行编写一个,并将其开源,以供其他开发者使用。
Paradox数据库将数据分割成多个文件,每个表和索引都有自己的文件。数据文件和索引文件结构相似,因此可以通过一个类来处理它们。
ParadoxFile是处理Paradox数据文件和索引的基类。它包含以下子类:
ParadoxTable表示表数据文件。
ParadoxPrimaryKey表示表索引。
包含所有数据类型的枚举。
表示数据记录。
实现了标准的IDataReader接口。
索引文件本质上是一个包含数据块索引和相关索引值的表。可以直接读取它,也可以使用作者创建的机制来遍历索引树,以找到所需的记录。
用于在索引数据中搜索的条件基类。
支持的比较操作符枚举(==, !=, <, <=, >, >=)。
var table = new ParadoxTable(dbPath, "zakazky");
var recIndex = 1;
foreach (var rec in table.Enumerate())
{
Console.WriteLine("Record #{0}", recIndex++);
for (int i = 0; i < table.FieldCount; i++)
{
Console.WriteLine("{0} = {1}", table.FieldNames[i], rec.DataValues[i]);
}
if (recIndex > 10) break;
}
var index = new ParadoxPrimaryKey(table, Path.Combine(dbPath, "zakazky.PX"));
var condition = new ParadoxCondition.LogicalAnd(
new ParadoxCondition.Compare(ParadoxCompareOperator.GreaterOrEqual, 1750, 0, 0),
new ParadoxCondition.Compare(ParadoxCompareOperator.LessOrEqual, 1760, 0, 0)
);
var qry = index.Enumerate(condition);
var rdr = new ParadoxDataReader(table, qry);
recIndex = 1;
while (rdr.Read())
{
Console.WriteLine("Record #{0}", recIndex++);
for (int i = 0; i < rdr.FieldCount; i++)
{
Console.WriteLine("{0} = {1}", rdr.GetName(i), rdr[i]);
}
}