覆盖 TFields 和 TStringField 中的 AsString

Overriding AsString in TFields and TStringField

当我们将数据库组件从 ODBC Express 交换到 ADO 时,我们 运行 遇到的最大问题之一是 ODBC Express "right-trimmed" 来自 CHAR 字段的结果而 ADO 没有。

CHAR 字段填满了它们的整个分配字段长度,因此当我们使用 ADO 查询它们时,您会得到很多额外的空间。

我们有很多数据库和代码,这些数据库和代码基本上取决于被修剪的数据库的结果。

我们的解决方案是编辑 delphi 源 DB.pas 并更改 TField 和 TStringField 中的 getasstring 方法。

这可行但不是可靠的解决方案是否有另一种方法可以在不更改 delphi 源代码的情况下修剪这些结果?

当切换到 ADO 时,我们决定不直接使用 TADOQuery class,而是派生了我们自己的查询:

  TOurAdoQuery = class(TADOQuery)
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    function ExecSQL: Integer;
    procedure Open;
  end;

从 TStringField 下降,类似于:

TYourStringField = class(TStringField)
protected
  function GetAsString: string; override;
end;

implementation
function TYourStringField.GetAsString: string;
begin
  Result := TrimRight(inherited GetAsString);
end;    

注册您的 class(您可能会在初始化部分执行此操作):

RegisterClass(TYourStringField);

将此行放在您通常为应用程序初始化内容的地方:

DefaultFieldClasses[ftString] := TYourStringField;

就是这样,下次您创建数据集时,所有 ftString 字段类型都将使用 TYourStringField 定义。