首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在设计时更改Delphi FireDAC tFDMemTable字段名

如何在设计时更改Delphi FireDAC tFDMemTable字段名
EN

Stack Overflow用户
提问于 2021-05-06 21:18:10
回答 1查看 158关注 0票数 2

我尝试将字段名'field1‘更改为’FDMemTable1field1 3‘。没有代码,所有的工作都在设计时完成。

代码语言:javascript
复制
TForm1 = class(TForm)
  DBGrid1: TDBGrid;
  DataSource1: TDataSource;
  FDMemTable1: TFDMemTable;
  FDMemTable1field1: TStringField;
  FDMemTable1field2: TStringField;

通过设计窗口中的FDMemTable1弹出菜单加载文件时,DBGrid1可以很好地显示数据。在对象检查器中将“field1”更改为“field3”将使FDMemTable1.Active“false”和DBGrid1的所有单元格清除。

切换FDMemTable1.Active 'true‘只显示DBGrid1标题'field3’和'field2‘,而不显示数据单元。

最后,加载相同的文件会触发错误Field 'field3' not found.,即使我在停用FDMemTable1之后更改了名称,结果也是一样的。

是否可以在设计时更改字段名?我是否应该将整个'field1‘复制到'field3’并在运行时删除前者?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-07 02:04:09

我认为你想要的一个问题是,你不能重命名FDMemTable中的字段,因为字段名称是存储在保存数据中的元数据中的。

也就是说,这是一个重命名FDMemTable字段而不必丢弃存储在其中的数据的最小示例。基本上,它以XML格式写出表的数据,将字段名(在本例中为'FieldA')更改为不同的名称('FieldB'),并从更改后的XML文件重新加载数据。

代码语言:javascript
复制
uses [...] FireDAC.Stan.StorageXML;

type
  TForm1 = class(TForm)
    FDMemTable1: TFDMemTable;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    Button1: TButton;
    FDStanStorageXMLLink1: TFDStanStorageXMLLink;
    procedure FormCreate(Sender: TObject);
  public
  end;

[...]

procedure TForm1.Button1Click(Sender: TObject);
var
  AFileName : String;
  TL : TStringList;
  S : String;
begin
  AFileName := 'C:\Temp\XMLData.XML';

  FDMemTable1.SaveToFile(AFileName, sfXML);
  TL := TStringList.Create;
  try
    TL.LoadFromFile(AFileName);
    FDMemTable1.Close;

    TL.Text := StringReplace(TL.Text, 'FieldA', 'FieldB', [rfReplaceAll]);
    TL.SaveToFile(AFileName);

    DBGrid1.Columns.Clear;
    FDMemTable1.FieldDefs.Clear;
    FDMemTable1.Fields.Clear;
    FDMemTable1.LoadFromFile(AFileName, sfXML);
  finally
    TL.Free;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  Link : TFDStanStorageXMLLink;  //  This is needed to reload the data in XML format
  AField : TField;
begin

  Link := TFDStanStorageXMLLink.Create(Self);

  AField := TIntegerField.Create(Self);
  AField.FieldName := 'ID';
  AField.DataSet := FDMemTable1;

  AField := TStringField.Create(Self);
  AField.FieldName := 'FieldA';
  AField.Size := 32;
  AField.DataSet := FDMemTable1;

  FDMemTable1.CreateDataSet;

  FDMemTable1.InsertRecord([1, 'One']);
  FDMemTable1.InsertRecord([2, 'Two']);
end;

显然,如果不想将数据写入文件系统,可以使用临时流以及FDMemTable的SaveToStream和LoadFromStream。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67418969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档