TManagedDataSet和DataSetPool的实现

TManagedDataSet和DataSetPool的实现

天天用Delphi,自己有了很多想法。写代码之余,有空闲时间就把一些东西整理成文档。

Delphi中使用最多的大概是AdoExpress组件,这是Borland封装了Microsoft的Ado的东东,使用频率最多的TAdoDataSet对应了Ado原生的RecordSet,在功能上做了一些增强,但用法基本一致,用多了就感觉TAdoDataSet还有扩充和改造的地方。

由于代码中使用了很多的TAdoDataSet控件,创建和释放对象非常频繁,而且每次创建后都要设置很多基本相同的属性,颇为麻烦。于是想到可以实现一个记录集池,每次当需要一个记录集时,从这个池中得到一个空闲且符合要求的(只读或可读写),用完了就被池回收,如果池中记录集不够,就自动生成新的记录集对象。

首先要做的是改造TAdoDataSet,我写了一个TManagedDataSet,继承自TAdoDataSet,可以自己知道自己是被人使用还是空闲(通过IsUsed()),重写了Free(),把本来释放的动作改为仅是把自己设置为空闲,并清除状态(Session)信息,并可以通过Source()返回一个指向自己的TDataSource对象。

有了这些基础后,就可以很快的构建TDataSetPool类了,这个类仅是保存可用的TManagedDataSet对象,通过GetDataSet(WantType : TManagedDataSetType)返回一个空闲的数据集对象,如果池中没有空闲的,就新建一个返回。TManagedDataSetType是枚举类,标识只读数据集和读写数据集(只读数据集可通过优化CursorType和LockType来加快读数据速度)。

下面的代码是直接从我做的一个项目的源文件中Copy出来的,有些乱,仅做参考。

unit ManagedDataSet;

interface

uses AdoDb, CommonDm, SysUtils, DB, dbgrids, ComObj, classes, contnrs;

type

TManagedDataSetType = (ReadOnly, Editable); // 猅羭摸

TXlsExpAdapter = class

private

_sXlsCaption : string;

_sXlsFileName : string;

_bOverwriteExistFile : Boolean;

_asFieldName : TStringList;

_asXlsTitle : TStringList;

_aDataType : TObjectList;

function GetDataType(const iniIndex : Integer) : TDataType;

function GetFieldName(const iniIndex : Integer) : string;

function GetXlsTitle(const iniIndex : Integer) : string;

public

constructor Create();

destructor Destroy();

property XlsCaption : string read _sXlsCaption Write _sXlsCaption;

property XlsFileName : string read _sXlsFileName Write _sXlsFileName;

property OverWriteExistFile : Boolean read _bOverwriteExistFile Write _bOverwriteExistFile;

procedure AddField(const insFieldName, insCaption : string; const intype : TDataType = ftUnKnown);

procedure GetInfoFromDBGrid(const ingrid : TDBGrid);

property DataType[const iniIndex : Integer] : TDataType read GetDataType;

property FieldName[const iniIndex : Integer] : string read GetFieldName;

property XlsTitle[const iniIndex : Integer] : string read GetXlsTitle;

function Count() : Integer;

end;

TManagedDataSet = class(TAdoDataSet)

private

_source : TDataSource;

_type : TManagedDataSetType;

_bUsed : Boolean;

procedure SetDataSetType(const intype : TManagedDataSetType);

function GetDataSource() : TDataSource;

public

constructor Create(const intype : TManagedDataSetType = Editable);

destructor Destroy(); override;

procedure Use();

procedure Free(); reintroduce; // 滦籠

Published At
Categories with Web编程
Tagged with
comments powered by Disqus