2015-03-13 33 views
1

當我們將數據庫組件從ODBC Express交換到ADO時,我們遇到的最大問題之一是ODBC Express「右調整」了來自CHAR字段的結果,而ADO則沒有。覆蓋TFields和TStringField中的AsString

CHAR字段填滿了整個分配的字段長度,所以當我們用ADO查詢它們時會得到很多額外的空間。

我們有很多數據庫和代碼基本上取決於數據庫被修剪的結果。

我們的解決方案是編輯delphi源DB.pas並從TField和TStringField更改getasstring方法。

這樣的工作,但不是一個固定的解決方案是否有另一種方式來獲得這些結果修剪而不改變delphi源代碼?

當switchting到ADO我們決定不直接使用TADOQuery類,而是我們得出我們自己:

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

所以你從你的DBMS提供商那裏得到了一些填充「Value」的空間,你想用ADO組件將它修剪爲「Value」,對吧?你有哪個版本的Delphi(問你是否沒有FireDAC可用)?你的數據庫後端是什麼? – TLama 2015-03-13 08:51:49

+0

我們主要使用Delphi 7和SQL Server,並且正在將代碼移植到XE,但切換到firedac並不是一個真正的選項。 – 2015-03-13 08:57:52

+2

那麼這是正確的,(N)CHAR列是固定長度的,如果你不想要這種行爲,你應該使用VARCHAR列。或者設置[ANSI PADDING OFF](https://msdn.microsoft.com/en-us/library/ms187403.aspx)。 – whosrdaddy 2015-03-13 09:01:18

回答

4

降序從TStringField,是這樣的:

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

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

註冊類(你可能會在初始化部分做到這一點):

RegisterClass(TYourStringField); 

把這條線放在哪裏喲ü通常爲您的應用程序初始化的東西:

DefaultFieldClasses[ftString] := TYourStringField; 

就是這樣,下次創建數據集中所有ftString字段類型將使用TYourStringField定義。