gpt4 book ai didi

database - 如何在运行时更改 Clientdataset 字段数据类型

转载 作者:太空狗 更新时间:2023-10-30 01:57:44 29 4
gpt4 key购买 nike

对于在设计时定义字段的 Delphi ClientDataSets,有没有办法在运行时更改特定字段的数据类型(更改 cds.Fields[n].DataType)?

我有一个遗留的 Delphi 7 程序,在设计时设置了 SQLDataSet 和 ClientDataSet 字段(为了覆盖各种属性)。

这些连接到第 3 方 Sybase SQL Anywhere 11 数据库。

最近供应商将所有“描述”字段从 VarChar(128) 更改为 long varchar,但仅限于他的某些客户。因此,当我查询这些“描述”字段时,我的代码必须支持这两种类型的字段。

我希望在类字段类型上设置条件编译(然后在打开 SQL/CLient 数据集之前添加字段),但是编译器忽略了类的组件定义部分中的 {$IFDEF } 条件(其中,我考虑得更多,很有道理)!

有数十个模块,数百个字段受到影响,因此欢迎任何见解。

最佳答案

我以前也遇到过这个问题,不是CDS,而是在设计时使用持久字段的TADODataSet。我认为下面的代码将帮助您了解如何修复/修补您的 CDS 数据集。

思路是查询相关的表schema;获取实际的文件数据类型;并通过从数据集中取消附加持久字段类型并添加新的匹配持久字段来“更改”持久字段类型:

// TData class    
procedure TData.DataModuleCreate(Sender: TObject);
var
I: Integer;
begin
for I := 0 to ComponentCount - 1 do
if (Components[I] is TCustomADODataSet) then
DataSetPrepareMemoFields(TDataSet(Components[I]));
end;

procedure TData.DataSetPrepareMemoFields(DataSet: TDataSet);
var
Fld: TField;
I: Integer;
FldName, CompName: string;
AOwner: TComponent;
begin
// Here you need to query the actual table schema from the database
// e.g. ADOConnection.GetFieldNames and act accordingly

// check which DataSet you need to change
// if (DataSet = dsOrders) or ... then...

if DataSet.FieldList.Count > 0 then
for I := DataSet.FieldList.Count - 1 downto 0 do
begin
if DataSet.FieldList.Fields[I].ClassNameIs('TMemoField') and (DataSet.FieldList.Fields[I].FieldKind = fkData) then
begin
// save TMemoField properties
AOwner := DataSet.FieldList[I].Owner;
CompName := DataSet.FieldList[I].Name;
FldName := DataSet.FieldList.Fields[I].FieldName;
// dispose of TMemoField
DataSet.FieldList[I].DataSet := nil; // Un-Attach it from the DataSet
// create TWideADOMemoField instead
Fld := TWideADOMemoField.Create(AOwner); // Create new persistent Filed instead
Fld.Name := CompName + '_W';
Fld.FieldName := FldName;
Fld.DataSet := DataSet;
end;
end;
end;

就是说,在我解决了这个问题之后,我再也没有使用过持久字段。我所有的字段都是在运行时生成的。包括计算/查找/内部字段。

关于database - 如何在运行时更改 Clientdataset 字段数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26663827/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com