本例用到:

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 字段)写入到一个缓冲区 }

读取字段的结构信息可以使用 TFieldDef 对象(一般来源于 FieldDefs 或 FieldDefList);

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

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

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

这是 holdings.xml 的字段信息:

ACCT_NBR { 类型是 r8, 对应 ftFloat, 相当于 Double }

SYMBOL { 类型是 string, 对应 ftString, 相当于 AnsiString; 指定 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('CommonProgramFiles') + '\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,v9: 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[fName]; { FieldValues 是默认的数组属性 }

v6 := ClientDataSet1.FieldList[0].Value;

v7 := ClientDataSet1.FieldList.FieldByName(fName).Value;

v8 := ClientDataSet1.FieldList.Find(fName).Value;

v9 := 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].AsString;

{ 读取倒数第二行第二个字段 }

ClientDataSet1.Last;

ClientDataSet1.Prior;

s2 := ClientDataSet1.Fields[1].AsString;

{ 读取第四行第二个字段 }

ClientDataSet1.RecNo := 4;

s3 := ClientDataSet1.Fields[1].AsString;

{ 查看结果 }

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_NBR; 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 AnsiChar;

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: TTimeStamp;

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

THoldingsStruct = packed record { 这是根据 holdings.xml 建立的数据结构 }

ACCT_NBR: Double;

SYMBOL: array[0..7] of AnsiChar; { 其 Size=7, 但后面还有个 #0 }

SHARES: Double;

PUR_PRICE: Double;

PUR_DATE: Integer;

// Other: array[0..4] of Byte; { 它后面还若干字节偏移, 测试时其字节数等于前面的字段数 }

end;

var

buf: THoldingsStruct;

DateTimeRec: TDateTimeRec;

begin

//ShowMessage(IntToStr(ClientDataSet1.RecordSize)); { 可通过这个值对照上面的结构 }

if ClientDataSet1.GetCurrentRecord(@buf) then with Memo1.Lines do

begin

Clear;

Add(FloatToStr(buf.ACCT_NBR));

Add(buf.SYMBOL);

Add(FloatToStr(buf.SHARES));

Add(FloatToStr(buf.PUR_PRICE));

DateTimeRec.Date := buf.PUR_DATE;

Add(DateToStr(TDateTimeRecToDateTime(ftDate, DateTimeRec)));

end;

end;

clientdataset 遍历字段_TClientDataSet[5]: 读取数据相关推荐

  1. clientdataset 遍历字段_Delphi TClientDataSet[五]: 读取数据

    Delphi TClientDataSet[5]: 读取数据. 本例用到: TClientDataSet.Fields[]; { 字段集合; 它比 FieldList 有更多功能, 如可获取嵌套字段 ...

  2. clientdataset 遍历字段_解决DBGridEh遍历记录后不移动当前行位置的方法

    解决DBGridEh遍历记录后不移动当前行位置的方法 在用DBGridEh配合ClientDataSet使用时,需要知道用户选择了哪些记录,可用遍历记录的方法查询选择列是否为真,但在这之后,Clien ...

  3. 从网页中读取数据 python_数据分析硬核技能:用 Python 爬取网页

    我作为数据科学家的第一个任务,就是做网页爬取.那时候,我对使用代码从网站上获取数据这项技术完全一无所知,它偏偏又是最有逻辑性并且最容易获得的数据来源.在几次尝试之后,网页爬取对我来说就几乎是种本能行为 ...

  4. kafka实际应用—>读取数据,并用java实现业务逻辑“行转列”

    kafka实际应用--读取数据,并用java实现业务逻辑"行转列" 一.业务需求 二.业务实现 2.1 kafka中创建topic: event_attendees_raw 2.2 ...

  5. matlab如何读取excel文件中的数据?_Python自动化之从Excel文件读取数据

    前言: 在Python语言,常用的excel读写库有xrld和openpyxl两个,当然pandas库也可以从excel文件中读取数据,但这里不建议使用.有个问题就是,xrld只能用于读取数据而不能用 ...

  6. 【Unity3D读取数据】(二)Json文件操作(创建、读取、解析、修改)

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...

  7. 使用Spark Streaming从kafka中读取数据把数据写入到mysql 实例

    文章目录 一. 题目 题目和数据 二. pom依赖 三.建表语句 四. 连接kafka配置类 五. 自定义分区类 六. 读取数据并发送数据 七. 消费数据,把数据存储到mysql 一. 题目 题目和数 ...

  8. Linux从mysql中读取数据_linux shell中读写操作mysql数据库

    本文介绍了如何在shell中读写mysql数据库.主要介绍了如何在shell 中连接mysql数据库,如何在shell中创建数据库,创建表,插入csv文件,读取mysql数据库,导出mysql数据库为 ...

  9. TensorFlow高效读取数据的方法

    概述 最新上传的mcnn中有完整的数据读写示例,可以参考. 关于Tensorflow读取数据,官网给出了三种方法: 供给数据(Feeding): 在TensorFlow程序运行的每一步, 让Pytho ...

最新文章

  1. C#实现有向无环图(DAG)拓扑排序
  2. io读取一个文件再写入socket技术_JAVA中IO与NIO面试题
  3. MD5在线查询的实现
  4. 使用tensoflow serving来部署模型推理节点
  5. 一行行地读取输入行,将把最长的行打印出来
  6. ImageMagick---import(截图)
  7. Ubuntu安装划词翻译软件Goldendict 单词翻译 句子翻译
  8. 工业交换机堆叠技术的优缺点
  9. 找出集合中重复元素和不重复元素
  10. jieba,为中文分词而生的Python库
  11. GD32F4—RTC闹钟及自动唤醒中断配置详解
  12. 通过图新地球把大疆L1激光雷达点云成果和影像地形等其他GIS数据进行融合
  13. 【笔记】openwrt - 单线复用(VLAN):拨号上网、局域网、IPTV
  14. Battery Historian2.0使用过程中遇到的一些问题
  15. Setting up Basic Access Control
  16. 国外高性能服务器,国内高性能的外国服务器如何选_网时云服务器
  17. linux 动态图片制作,Ubuntu 17.10下使用kazam制作gif动态图片
  18. C# 获取当前时间戳(正确版)
  19. Android 蓝牙开发
  20. python大佬教你爬虫反爬:破解雪碧图反爬

热门文章

  1. WIN7系统激活后无法正常启动
  2. 答TOGAF企业架构的一些问题
  3. android getprop 分辨率,Android getprop 读取的属性哪里来的?
  4. php 头bom_关于php中bom头的简介
  5. 全网最详细SpringBatch批处理读取分区(Paratition)文件讲解
  6. centos7 minimal运行vue项目npm run serve时报错:Error: spawn xdg-open ENOENT --解决办法:yum install xdg-utils
  7. Scala 方法参数列表是val 不可修改
  8. Linux 交换文件已存在解决办法
  9. SSL四次握手的过程
  10. spring boot新建非web项目(无需依赖)