比如我有一个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
运行期时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
依然提示: field "e" not found.
cds1.FieldValues['a'] := 'a' ;
cds1.FieldValues['b'] := 'b' ;
cds1.FieldValues['c'] := 'c' ;
cds1.FieldValues['e'] := 'e' ; //这里提示错误:field 'e' not found
cds1.Post;
并对此表进行增删改等操作。
可能我誤解了。那你就加完這些後再 cds.createDateset;
cds1.FieldDefs.Add('e', ftInteger);
引用 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;
======================================================
还是会出错。
我想在运行期加一个字段。程序运行后我点击一个按钮事件执行以下代码: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
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.
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;
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控件,这样计算字段要容易些。
這樣搞下去,你不瘋我都瘋了。呵呵。 我放了一個DataSource, 一個 DataPrivoide, 一個 clientdataset上面的可以,沒有錯。。 你檢查下你的CDS裏面是不是有字段了??或者重新放一個CDS上去。
cds1a: TStringField;
cds1b: TStringField;
cds1c: TStringField;
cds1d: TStringField;
这些就是他的字段。
其实在运行期把设计期的CDS的字段删除掉,再重新建立是可以的,
可我现在不想这么麻烦。
呵呵。
那就不成功的事情難著做吧。折騰死我了。難怪重建DATASET會出你那個錯。