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

database – 如何在运行时更改Clientdataset字段数据类型,第1张

概述对于已在设计时定义字段的Delphi ClientDataSets,是否有一种方法可以在运行时更改特定字段的数据类型(更改cds.Fields [n] .DataType)? 我有一个遗留的Delphi 7程序,在设计时设置了SQLDataSet和ClientDataSet字段(为了覆盖各种属性). 它们连接到第三方Sybase SQL Anywhere 11数据库. 最近,供应商将VarChar 对于已在设计时定义字段的Delphi ClIEntDataSets,是否有一种方法可以在运行时更改特定字段的数据类型(更改cds.FIElds [n] .DataType)?

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

它们连接到第三方Sybase sql Anywhere 11数据库.

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

我希望在类字段类型上设置条件编译(然后在打开sql / CLIEnt数据集之前添加字段),但编译器会忽略类的组件定义部分中的{$IFDEF}条件(我认为越多)关于它,很有道理)!

有几十个模块,有数百个字段受到影响,所以任何见解都值得赞赏.

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

想法是查询相关的表模式;获取实际的fileds数据类型;并通过从DataSet取消附加并添加新的匹配持久字段来“更改”持久字段类型:

// 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字段数据类型全部内容,希望文章能够帮你解决database – 如何在运行时更改Clientdataset字段数据类型所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1234138.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存