2017-08-04 87 views
1

我有一个数据集TclientDataSet其中的字段是由代码创建的。 我需要用户在保留现有数据的同时附加其他字段。如何在没有CreateDataset的情况下将新字段添加到数据集?

`MYclientDataSet.FieldDefs.Add(s, ftString, 20); 
MYclientDataSet.CreateDataset; 
MYclientDataSet.Open; 
MYclientDataSet.edit; 
MYclientDataSet.FieldByName(s).AsString := 'Test'; 
MYclientDataSet.post;` 

这可以工作,但CreateDataset会擦除所有数据。 有什么方法将新字段添加到数据集?

我已经尝试了许多其他的解决方案,但没有一个似乎工作

千恩万谢

+0

您可以加入有关您的其他解决方案一些细节已经尝试过? –

回答

1

如果你问fkData类型的字段,即那些这将被包含在所保存的数据的CDS,可以不加这些字段一旦CDS已经打开。

我知道达到同等效果的最简单方法是

  1. 保存CDS数据XML。

  2. 修改定义fkData字段的XML中的元数据,以添加所需的元数据。

  3. 保存XML。

  4. 重新从XML中加载CDS。

我想我贴的如何做到这一点的答复的SO q中的前一段时间的例子。如果我能找到它,我会在稍后添加一个链接。

4

您可以用下面的代码,基本上保存当前数据实现这一目标,创造新场结构,并复制保存的数据回:

var 
    cds: TClientDataSet; 
begin 
    cds := TClientDataSet.Create(nil); 
    try 
    cds.Data := MyClientDataSet.Data; 
    MyClientDataSet.Close; 
    MyClientDataSet.FieldDefs := cds.FieldDefs; 
    MyClientDataSet.FieldDefs.Add('Note', ftString, 20); 
    MyClientDataSet.CreateDataSet; 
    cds.First; 
    while not cds.Eof do begin 
     MyClientDataSet.Append; 
     MyClientDataSet.CopyFields(cds); 
     MyClientDataSet.FieldByName('Note').AsString := 'Test'; 
     MyClientDataSet.Post; 
     cds.Next; 
    end; 
    finally 
    cds.Free; 
    end; 
end; 
+0

这工作正常。在检查XML文件的内容时,由于我在关闭应用程序之前使用了savetofile,所以'MyClientDataSet.Post;'插入了一行额外的数据。所以邮件被删除了 –

相关问题