如何在运行时向clientdataset添加字段?

Clo*_*ble 7 database delphi tclientdataset dataset

我有一个TClientDataSetTTable数据集提供的.数据集有两个字段:邮政编码(字符串,5)和街道(字符串,20)

在运行时,我想显示第三个字段(字符串,20).该字段的例程是将邮政编码作为参数并将该城市归属于该邮政编码.

问题只是将计算字段添加到现有字段中.填充数据本身不是问题.

我试过了:

  cds.SetProvider(Table1);
  cds.FieldDefs.Add('city', ftString, 20);

  cds.Open;

  cds.Edit;
  cds.FieldByName('city').AsString := 'Test';  // --> errormessage (field not found)
  cds.Post;
Run Code Online (Sandbox Code Playgroud)

cds是我的clientdataset,Table1是一个悖论表,但问题与其他数据库相同.

提前致谢

Ser*_*yuz 20

如果要添加基础数据中存在的其他字段,则还需要手动添加现有字段.在添加字段时,需要关闭数据集,但FieldDefs.Update如果您不想手动跟踪所有字段详细信息,则可以使用必要的元数据.基本上是这样的:

var
  i: Integer;
  Field: TField;
begin    
  cds.SetProvider(Table1);

  // add existing fields
  cds.FieldDefs.Update;
  for i := 0 to cds.FieldDefs.Count - 1 do 
    cds.FieldDefs[i].CreateField(cds);

  // add calculated field
  Field := TStringField.Create(cds);
  Field.FieldName := 'city';
  Field.Calculated := True;
  Field.DataSet := cds;

  cds.Open;
end;
Run Code Online (Sandbox Code Playgroud)


也看到这个优秀的文章卡里延森.


Clo*_*ble 6

好吧,我找到了一个更简单的解决方案,因为我的 sql 中有 24 个字段,我不想手动添加它们,所以我在 sql 语句中添加了一个虚拟字段,如下所示:

select '      ' as city, the rest of the fields ... 
Run Code Online (Sandbox Code Playgroud)

我可以在我的程序 OnAfterOpen 事件中修改它。

好吧,我必须在 sql 中定义该字段应该有多长,留足够的空格,例如 5 个空格代表 5 个字符,所以我必须知道城市名称可以有多长。