比如我有一个clientDataSet,在设计期时建立了三个字段:A,B,C
运行期时clientDataSet还没有数据之前,请问如何增加或删除一个字段?我本来想用以下代码增加一个字段,但是出错。VAR
  F: TStringField;
begin
  cds1.Close;
  F:= TStringField.Create(cds1);
  f.Name :='e';
  f.FieldName := 'e';
  f.DataSet := cds1;
  f.FieldKind:= fkData;
  cds1.FieldDefs.Update;
  cds1.open;  //运行到这句就出错了,提示: cds1: field 'e' not found
end

解决方案 »

  1.   

      ClientDataSet1.FieldList.Delete(index);
      

  2.   

    TFieldDef.Create(DataSet.FieldDefs, 'e', ftString, 50, False, 0);
      

  3.   


    依然提示: field "e" not found.
      

  4.   

        cds1.Append;
        cds1.FieldValues['a'] := 'a' ;
        cds1.FieldValues['b'] := 'b' ;
        cds1.FieldValues['c'] := 'c' ;
        cds1.FieldValues['e'] := 'e' ;   //这里提示错误:field 'e' not found
        cds1.Post;
      

  5.   

    我的clientdataset没有跟数据源打交道的,我的做法相当于在ClientDataSet建立一个表,
    并对此表进行增删改等操作。
      

  6.   


    可能我誤解了。那你就加完這些後再 cds.createDateset; 
      

  7.   

    增加字段可以用
    cds1.FieldDefs.Add('e', ftInteger);
      

  8.   

    引用 8 楼 linghengmao 的回复:
    引用 7 楼 starluck 的回复: 
    引用 6 楼 linghengmao 的回复: 
    引用 4 楼 linghengmao 的回复: 
    引用 3 楼 preserve 的回复: 
    TFieldDef.Create(DataSet.FieldDefs, 'e', ftString, 50, False, 0); 
    依然提示: field "e" not found.     cds1.Append; 
        cds1.FieldValues['a'] := 'a' ; 
        cds1.FieldValues['b'] := 'b' ; 
        cds1.FieldValues['c'] := 'c' ; 
        cds1.FieldValues['e'] := 'e' ;  //这… 
     可能我誤解了。那你就加完這些後再 cds.createDateset; 
    ======================================================
    还是会出错。
      

  9.   

    比如我有一个clientDataSet,在设计期时建立了三个字段:A,B,C 
    我想在运行期加一个字段。程序运行后我点击一个按钮事件执行以下代码:VAR 
      F: TStringField; 
    begin 
      cds1.Close; 
      F:= TStringField.Create(cds1); 
      f.Name :='e'; 
      f.FieldName := 'e'; 
      f.DataSet := cds1; 
      f.FieldKind:= fkData; 
      cds1.FieldDefs.Update; 
      cds1.open;  //运行到这句就出错了,提示: cds1: field 'e' not found 
    end
      

  10.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, StdCtrls, Grids, DBGrids, DBClient;type
      TForm1 = class(TForm)
        ds1: TDataSource;
        cds1: TClientDataSet;
        dbgrd1: TDBGrid;
        cds1a: TStringField;
        cds1b: TStringField;
        cds1c: TStringField;
        cds1d: TStringField;
        btn2: TButton;
        procedure btn2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.btn2Click(Sender: TObject);
    var
        f:TStringField;
    begin
      cds1.Active   :=false;
      f:=TStringField.Create(cds1);
      f.Name   :='e';
      f.FieldName   :='e';
      f.DataSet   :=cds1;
      f.Visible   :=true;
      f.FieldKind   :=fkdata   ;
      cds1.FieldDefs.Update;
      cds1.Active   :=true;
    end;end.
      

  11.   

    procedure TForm2.Button1Click(Sender: TObject);
    var
        f:TStringField;
    begin
      cds1.Active  :=false;
      f:=TStringField.Create(cds1);
      f.Name  :='e';
      f.FieldName  :='e';
      f.DataSet  :=cds1;
      f.Visible  :=true;
      f.FieldKind  :=fkdata  ;
      cds1.CreateDataSet;
      cds1.Active  :=true;
    end;
      

  12.   

    给你个例子:cds1.Next;
    while not cds1.Eof do
    begin
      Cds1.Prior;
      cds1.Edit;
      cds1.FieldbyName('C3').AsString := cds1.FieldByName('c1').AsString
           + ':' + cds1.FieldbyName('c2').AsString;  CdsMain.Post;
      CdsMain.Next;
      CdsMain.Delete;
    end;
    这是部分程序,要实现两个字段组合成一个字段,因为MySQL和SQLServer对于字段的连接有不同的方式,所以采用这种
    方法。
    执行的SQL语句可以类似这样写:
    select c1,c2, '' as c3 from t1 ;
    c1 c2为数据库中的字段,c3为计算字段,数据库中没有的
    当然也可以使用Delphi的BDE控件,这样计算字段要容易些。
      

  13.   


    這樣搞下去,你不瘋我都瘋了。呵呵。 我放了一個DataSource, 一個 DataPrivoide, 一個 clientdataset上面的可以,沒有錯。。   你檢查下你的CDS裏面是不是有字段了??或者重新放一個CDS上去。
      

  14.   

    我的CDS设计期是有字段的,不然事情就好办了。
        cds1a: TStringField; 
        cds1b: TStringField; 
        cds1c: TStringField; 
        cds1d: TStringField; 
    这些就是他的字段。
    其实在运行期把设计期的CDS的字段删除掉,再重新建立是可以的,
    可我现在不想这么麻烦。
    呵呵。
      

  15.   


    那就不成功的事情難著做吧。折騰死我了。難怪重建DATASET會出你那個錯。
      

  16.   

    19楼的 如果数据库是access 那么你的c3字段就没办法修改的