我用如下方法,向clientdataset动态建立字段, clientdataet指向fquery..
var
i:integer;
a:Tfield;
begin
    fcds.Close;
    for i:=0 to fquery.FieldCount-1  do
     begin
      a:=Tstringfield.Create(fcds);
      a.FieldName:=fquery.Fields[i].FieldName;
      a.DataSet:=fcds;
      a.FieldKind:=fkdata;
     end;
   fcds.FieldDefs.Update;
   fcds.open;
end;
但运行时出现错误,:type mismatch for field "pc_no".expecting string, actual is widestring..
就是字段类型不匹配
 这问题怎么解决啊?

解决方案 »

  1.   

    a:=Tstringfield.Create(fcds); 
    估计是因为这句你写死了字段类型的原因
      

  2.   

    var
    i:integer;
    a:Tfield;
    begin
        fcds.Close;
        for i:=0 to fquery.FieldCount-1  do
        begin
          a:=TFieldClass(fquery.Fields[i].ClassType).Create(fcds);
          a.FieldName:=fquery.Fields[i].FieldName;
          a.DataSet:=fcds;
          a.FieldKind:=fkdata;
        end;
      fcds.FieldDefs.Update;
      fcds.open;
    end; 
      

  3.   


    function TDocRoleManage_RealDetail_f.UF_CreateDataSet(): TClientDataSet;
    var
        cds: TClientDataSet;
        lfd_FieldDef: TFieldDef;
        lid_IndexDef: TIndexDef;
    begin
        //result := Nil;
        cds := TClientDataSet.Create(nil);    lfd_FieldDef := cds.FieldDefs.AddFieldDef;
        lfd_FieldDef.Name := 'LBDM';
        lfd_FieldDef.DataType := ftString;
        lfd_FieldDef.Size := 10;    lfd_FieldDef := cds.FieldDefs.AddFieldDef;
        lfd_FieldDef.Name := 'XH';
        lfd_FieldDef.DataType := ftString;
        lfd_FieldDef.Size := 2;    lfd_FieldDef := cds.FieldDefs.AddFieldDef;
        lfd_FieldDef.Name := 'DM';
        lfd_FieldDef.DataType := ftString;
        lfd_FieldDef.Size := 10;    lfd_FieldDef := cds.FieldDefs.AddFieldDef;
        lfd_FieldDef.Name := 'DES';
        lfd_FieldDef.DataType := ftString;
        lfd_FieldDef.Size := 50;    //lid_IndexDef.Options := 'ixDescending';    cds.CreateDataSet;
        result := cds;    //  cds.IndexDefs;
    end;