Delphi TClientDataSet[5]: 读取数据。

本文详细介绍了如何使用 Delphi 中的 TClientDataSet 对象读取数据,包括字段的访问方式、记录导航、数据获取等操作。通过示例代码展示了多种读取字段值的方法,并提供了遍历记录、定位特定字段值的实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本例用到:

TClientDataSet.Fields[];      { 字段集合; 它比 FieldList 有更多功能, 如可获取嵌套字段 }  
TClientDataSet.FieldList[];    { 字段列表; 它比 Fields 轻便, 如果只是取值用它快一些 } 
TClientDataSet.FieldByName();   { 根据字段名称获取字段对象; 获取一个字段对象时它比上两个快 } 
TClientDataSet.FindField();    { 根据字段名称查找字段对象 } 
TClientDataSet.FieldValues[];   { 根据字段名称获取字段值; 如果仅是获取字段值, 这个最快 } 
TClientDataSet.First;       { 到第一个记录 } 
TClientDataSet.Next;        { 到下一个记录 } 
TClientDataSet.Last;        { 到最后一个记录 } 
TClientDataSet.Prior;       { 到上一个记录 } 
TClientDataSet.RecNo;       { 设置或读取当前记录的位置 } 
TClientDataSet.Bof;        { 当前位置是否是第一个记录 } 
TClientDataSet.Eof;        { 当前位置是否是最后一个记录 } 
TClientDataSet.RecordSize;     { 一个记录的大小; 所谓一个记录就是当前行的所有字段 } 
TClientDataSet.RecordCount;    { 记录总数; 也就是总行数 } 
TClientDataSet.GetFieldList();   { 根据指定的几个字段名获取字段对象的列表 } 
TClientDataSet.GetFieldData();   { 把指定字段的值写入一个缓冲区 } 
TClientDataSet.GetCurrentRecord(); { 把当前记录(不包括 Bolb 字段)写入到一个缓冲区 } 

关键字: TClientDataSet GdiPlus[1] RegularExpreio GdiPlus XMLDocument 类详解
TClientDataSet[5]: 读取数据。
  读取字段的结构信息可以使用 TFieldDef 对象(一般来源于 FieldDefs 或 FieldDefList);

  现在要读取其中的数据, 应该使用 TField 对象(一般来源于 Fields 或 FieldList).

  Fields[0]、Fields[1] ... Fields[n] 获取的是当前行的第几个字段, 可用 Next、RecNo 等指定当前位置(行).

  下面的例子使用了 Common Files\CodeGear Shared\Data\holdings.xml, 若更换文件需调整代码.

  这是 holdings.xml 的字段信息:

ACCT_R { 类型是 r8, 对应 ftFloat, 相当于 Double } 
SYMBOL  { 类型是 string, 对应 ftString, 相当于 AiString; 指定 Size=7, 加上空结束, 大小是 8 } 
SHARES  { 类型是 r8, 对应 ftFloat, 相当于 Double } 
PUR_PRICE { 类型是 r8, 对应 ftFloat, 相当于 Double } 
PUR_DATE { 类型是 date, 对应 ftInteger, 相当于 Integer } 

  先窗体上放置 ClientDataSet1、DataSource1、DBGrid1、Memo1 和七个 Button, 然后:

{ 准备数据, 也可在设计时完成 } 
procedure TForm1.FormCreate(Sender: TObject); 
begin 
 ChDir(GetEnvironmentVariable('CommorogramFiles') + '\CodeGear Shared\Data\'); 
 ClientDataSet1.LoadFromFile('holdings.xml'); 
 DBGrid1.DataSource := DataSource1; 
 DataSource1.DataSet := ClientDataSet1; 
end; 
 
{ 读取字段值的几种方法 } 
procedure TForm1.Button1Click(Sender: TObject); 
var 
 v1,v2,v3,v4,v5,v6,v7,v8: Variant; 
 num: Double; 
 fName: string; 
begin 
 { 获取首字段的名称 } 
 fName := ClientDataSet1.Fields[0].FieldName; 
 
 { 获取第一个字段值的几种方法: } 
 v1 := ClientDataSet1.Fields[0].Value; 
 v2 := ClientDataSet1.FieldByName(fName).Value; 
 v3 := ClientDataSet1.FindField(fName).Value; 
 v4 := ClientDataSet1.FieldValues[fName]; 
 v5 := ClientDataSet1.FieldList[0].Value; 
 v6 := ClientDataSet1.FieldList.FieldByName(fName).Value; 
 v7 := ClientDataSet1.FieldList.Find(fName).Value; 
 v8 := ClientDataSet1.FieldList.Fields[0].Value; 
 
 { 已知这个字段是 Double 类型的, 可同时转换 } 
 num := ClientDataSet1.Fields[0].AsFloat; 
 
 { 查看结果 } 
 with Memo1.Lines do begin 
  Clear; 
  Add(v1); Add(v2); Add(v3); Add(v4); Add(v5); Add(v6); Add(v7); Add(v8); 
  Add(FloatToStr(num)); 
 end; 
end; 
 
{ 遍历当前行字段的几种方法 } 
procedure TForm1.Button2Click(Sender: TObject); 
var 
 Field: TField; 
 i: Integer; 
begin 
 Memo1.Clear; 
 for Field in ClientDataSet1.Fields do 
 begin 
  Memo1.Lines.Add(Field.Value); 
 end; 
 Memo1.Lines.Add(''); 
 
 for i := 0 to ClientDataSet1.FieldCount - 1 do 
 begin 
  Memo1.Lines.Add(ClientDataSet1.Fields[i].Value); 
 end; 
 Memo1.Lines.Add(''); 
 
 for i := 0 to ClientDataSet1.FieldList.Count - 1 do 
 begin 
  Memo1.Lines.Add(ClientDataSet1.FieldList[i].Value); 
 end; 
 Memo1.Lines.Add(''); 
end; 
 
{ First、Next、Last、Prior、RecNo } 
procedure TForm1.Button3Click(Sender: TObject); 
var 
 s1,s2,s3: string; 
begin 
 { 读取第二行第二个字段 } 
 ClientDataSet1.First; 
 ClientDataSet1.Next; 
 s1 := ClientDataSet1.Fields[1].Atring; 
 
 { 读取倒数第二行第二个字段 } 
 ClientDataSet1.Last; 
 ClientDataSet1.Prior; 
 s2 := ClientDataSet1.Fields[1].Atring; 
 
 { 读取第四行第二个字段 } 
 ClientDataSet1.RecNo := 4; 
 s3 := ClientDataSet1.Fields[1].Atring; 
 
 { 查看结果 } 
 with Memo1.Lines do begin 
  Clear; 
  Add('第二行第二个字段: ' + s1); 
  Add('倒数第二行第二个字段: ' + s2); 
  Add('第四行第二个字段: ' + s3); 
 end; 
end; 
 
{ 遍历指定字段的所有记录 } 
procedure TForm1.Button4Click(Sender: TObject); 
var 
 i: Integer; 
begin 
 if not ClientDataSet1.Bof then ClientDataSet1.First; 
 Memo1.Clear; 
 while not ClientDataSet1.Eof do 
 begin 
  Memo1.Lines.Add(ClientDataSet1.FieldList[0].Value); 
  ClientDataSet1.Next; 
 end; 
 Memo1.Lines.Add('-------'); 
 
 for i := 1 to ClientDataSet1.RecordCount do 
 begin 
  ClientDataSet1.RecNo := i; 
  Memo1.Lines.Add(ClientDataSet1.FieldList[1].Value); 
 end; 
end; 
 
{ 通过 GetFieldList 可以读取几个指定字段的 TField 对象的列表 } 
procedure TForm1.Button5Click(Sender: TObject); 
var 
 List: TList; 
 Field: TField; 
 i: Integer; 
begin 
 List := TList.Create; 
 ClientDataSet1.GetFieldList(List, 'ACCT_R; SYMBOL; SHARES'); 
 
 Memo1.Clear; 
 for i := 0 to List.Count - 1 do 
 begin 
  Field := List[i]; 
  Memo1.Lines.Add(Field.Value); 
 end; 
 
 List.Free; 
end; 
 
{ GetFieldData 读取字段值到指针 } 
procedure TForm1.Button6Click(Sender: TObject); 
var 
 F1: Double; 
 F2: array[0..7] of AiChar; 
begin 
 ClientDataSet1.GetFieldData(ClientDataSet1.Fields[0], @F1); 
 ClientDataSet1.GetFieldData(ClientDataSet1.Fields[1], @F2); 
 
 with Memo1.Lines do begin 
  Clear; 
  Add(FloatToStr(F1)); 
  Add(F2); 
 end; 
end; 
 
//这是后面的例子用到的函数, 转换 TClientDataSet 时间格式到 TDateTime 
function TDateTimeRecToDateTime(DataType: TFieldType; Data: TDateTimeRec): TDateTime; 
var 
 TimeStamp: TTimeStam 
begin 
 case DataType of 
  ftDate: 
   begin 
    TimeStamp.Time := 0; 
    TimeStamp.Date := Data.Date; 
   end; 
  ftTime: 
   begin 
    TimeStamp.Time := Data.Time; 
    TimeStamp.Date := DateDelta; 
   end; 
 else 
  try 
   TimeStamp := MSecsToTimeStamp(Data.DateTime); 
  except 
   TimeStamp.Time := 0; 
   TimeStamp.Date := 0; 
  end; 
 end; 
 Result := TimeStampToDateTime(TimeStamp); 
end; 
 
{ GetCurrentRecord 是把当前行的所有字段(不包括 Blob 字段)读入到缓冲区 } 
procedure TForm1.Button7Click(Sender: TObject); 
type 
 THoldingtruct = packed record { 这是根据 holdings.xml 建立的数据结构 } 
  ACCT_R: Double; 
  SYMBOL: array[0..7] of AiChar; { 其 Size=7, 但后面还有个 #0 } 
  SHARES: Double; 
  PUR_PRICE: Double; 
  PUR_DATE: Integer; 
//  Other: array[0..4] of Byte; { 它后面还空着若干字节, 其字节数等于前面的字段数 } 
 end; 
var 
 buf: THoldingtruct; 
 DateTimeRec: TDateTimeRec; 
begin 
 //ShowMeage(IntToStr(ClientDataSet1.RecordSize)); { 可通过这个值对照上面的结构 } 
 if ClientDataSet1.GetCurrentRecord(@buf) then with Memo1.Lines do 
 begin 
  Clear; 
  Add(FloatToStr(buf.ACCT_R)); 
  Add(buf.SYMBOL); 
  Add(FloatToStr(buf.SHARES)); 
  Add(FloatToStr(buf.PUR_PRICE)); 
 
  DateTimeRec.Date := buf.PUR_DATE; 
  Add(DateToStr(TDateTimeRecToDateTime(ftDate, DateTimeRec))); 
 end; 
end; 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值