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

13

我有一个TClientDataSet,它的数据集由一个TTable提供。 该数据集有两个字段:postalcode(字符串,5)和street(字符串,20)。

在运行时,我想显示第三个字段(字符串,20)。该字段的例程是将postalcode作为参数获取,并返回属于该postalcode的城市。

问题只涉及将已有的字段添加一个计算字段。填充数据本身不是问题。

我尝试过:

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

  cds.Open;

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

cds是我的客户端数据集,Table1是一个Paradox表,但是其他数据库也有同样的问题。

提前感谢。


类似于我的问题 - James Barrass
5个回答

27

如果你想添加除了底层数据中已有的字段之外的其他字段,那么你还需要手动添加现有的字段。在添加字段时必须关闭数据集,但如果不想手动跟踪所有字段细节,则可以使用 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;


请参阅Cary Jensen写的这篇 优秀文章


谢谢您的回答和提供的好链接,我会尝试这个方法,不过我需要手动添加所有的 SQL 字段。 - CloudyMarble

6

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

select '      ' as city, the rest of the fields ... 

我希望在我的程序的OnAfterOpen事件中修改它。

嗯,我必须在SQL中定义该字段的长度,留出足够的空间,例如5个空格代表5个字符,因此我必须知道城市名称可能有多长。


1
这可能看起来不太优雅,但实现起来非常容易。 - srayner

4
你应该在添加字段后使用CreateDataset
cds.SetProvider(Table1);
cds.FieldDefs.Add('city', ftString, 20);
cds.CreateDataset; 

cds.Open;
cds.Edit;
cds.FieldByName('city').AsString := 'Test';  
cds.Post;

3

希望分享更准确的查询方法,针对不存在的字段。我认为最好使用cast而不是空格!

select E.NAME, E.SURNAME, cast(null as varchar(20)) as CITY
from EMPLOYEE E

例如:| Marc'O | Polo | <NULL> |

这种写法更加准确,可以清楚地看到字段大小,易于理解、简单、安全!


1

如果您想将已存在的“动态”数据字段(来自提供方)与其他客户端持久字段(计算、查找、内部计算、聚合)结合起来,您应该对CDS进行子类化。只需引入额外的布尔属性CombineFields,然后覆盖BindFields(在较新的Delphi版本中)或整个InternalOpen(如我在d2006/2007中所做的那样),并使用以下行:

if DefaultFields or CombineFields then CreateFields; { TODO -ovavan -cSIC : if CombineFields is true then persistent fields will coexist with Default ones }

这将使您避免所有运行时混乱的FieldDefs/CreateField问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接