习惯了.net的DataTable,便习惯性的认为Delphi中也有类似的东西,结果搞了好久才搞定,看来看去是拿着Delphi实现.net的思想,生搬硬套了,不过倒也解决了一些问题语言间的思想差别还是有的呃。
1数据集的创建CreatDataSet: TDataSet;
目标是创建一个类似于DataTable的对象,我们可以指定列的字段,也可以手动添加行。
在Delphi中是用DB.TDataSet来实现的(相当于DataTable,与.net的DataSet可是两个概念啊)。
在这里要用到DBClient.TClientDataSet,至于两者的关系,自己去查吧。
方法如下:
function TForm3.CreateDataSet: TDataSet;
var
dsTemp:TDataSet;
cdsTemp: TClientDataSet;
begin
//初始化
dsTemp := TDataSet.Create(Application);
try
//字段名设置
with dsTemp.FieldDefs do
begin
Add('code',ftString,8);
Add('name',ftString,20);
Add('Number',ftInteger);
end;
//创建DataSet
cdsTemp := TClientDataSet.Create(Application);
if dsTemp.FieldDefs <> nil then
begin
cdsTemp.FieldDefs.Assign(dsTemp.FieldDefs);
cdsTemp.CreateDataSet;
result := (cdsTemp as TDataSet);
end;
finally
//内存释放
dsTemp.Free;
end;
end;
2 数据集数据的添加AddDataToSet;很简单的 打开数据集-添加行-赋值-提交
function TForm3.AddDataToSet(AdsData: TDataSet): TDataSet;
var
intLoop:Integer;
begin
//打开数据集
AdsData.Open;
with AdsData do
begin
for intLoop := 0 to 10 do
begin
Append;//添加
FieldByName('Code').AsString := 'Code' + intToStr(intLoop);
FieldByName('Name').AsString := 'Name' + intToStr(intLoop);
FieldByName('Code').AsInteger := intLoop;
post;//提交
end;
end;
end;
3 修改数据集中某个Field的值 ChangeDataSetValue。这个在.net中可以直接改,不过在这里还是有区别的。这里我们把刚才建的数据集中Name Field的值给改掉
示例代码如下:
AdsData.Open; //打开
AdsData.First;
while Not AdsData.Eof do
begin
AdsData.FieldByName('Name').ReadOnly := false; //只读属性修改
AdsData.Edit; //打开编辑
AdsData.FieldByName('Name').AsString := 'NewName'; //修改
AdsData.Post; //提交
AdsData.Next;
end;