覆盖 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 定义。
当我们将数据库组件从 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 定义。