非BDE方式操作Paradox数据库文件

在数据库开发中,经常会遇到一些难以控制的黑箱技术,比如BDE(Borland Database Engine)。本文将展示如何在不使用BDE的情况下,直接操作Paradox数据库文件并读取数据,同时利用主索引查找特定记录。

开发者在面对技术黑箱时,往往希望能够打开它,进行调试、跟踪,甚至查看其内部结构。本文作者在寻找.NET原生的Paradox数据库读取器未果后,决定自行编写一个,并将其开源,以供其他开发者使用。

Paradox数据库文件结构

Paradox数据库将数据分割成多个文件,每个表和索引都有自己的文件。数据文件和索引文件结构相似,因此可以通过一个类来处理它们。

ParadoxFile是处理Paradox数据文件和索引的基类。它包含以下子类:

  • ParadoxFile.DataBlock:表示数据块
  • ParadoxFile.FieldInfo:字段的数据类型
  • ParadoxFile.V4Hdr:仅在某些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]); } }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485