Delphi TClientDataSet[5]: 读取数据。

本例用到:

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;

clientdataset 遍历字段_Delphi TClientDataSet[五]: 读取数据相关推荐

  1. clientdataset 遍历字段_TClientDataSet[5]: 读取数据

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

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

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

  3. 编写图形界面程序,接受用户输入的5个浮点数据和一个文件目录名,将这五个数据保存在该文件中,再从文件中读取出来并且进行从大到小排序,然后再一次追加保存在该文件中。

    File(文件特征与管理):用于文件或者目录的描述信息,例如生成新目录,修改文件名,删除文件,判断文件所在路径等. InputStream(二进制格式操作):抽象类,基于字节的输入操作,是所有输入流的 ...

  4. UDS诊断系列之十五 通过DID读取数据(22)服务

    通过DID读取数据服务,服务ID是0x22,主要功能是通过数据标识符(Data Identifier/DID)读取ECU存储的数据. 一.服务说明 先说什么是数据标识符(Data Identifier ...

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

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

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

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

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

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

  8. hbase shell查询表中某字段不为空的数据量_HBase工作原理

    HBASE原理 一.原理 1.物理存储 1.hregion hbase表中的数据按照行键的字典顺序排序,hbase表中的数据按照行的的方向切分为多个region. 最开始只有一个region随着数据量 ...

  9. IO流 (五) ----- 对象数据的序列化与反序列化

    相关文章: <IO流 (一) ----- 基本概念和File类> <IO流 (二) ----- 文件流> <IO流 (三) ----- 字符流和字符缓冲流> < ...

最新文章

  1. eclipse安装maven
  2. 差异与阵列和阵列结构和链表的区别
  3. 电脑服务器不稳定怎么办,网速不稳定怎么办? 网速不稳定的原因与解决办法-电脑教程...
  4. java 抢单功能设计_java毕业设计_springboot框架的抢单兼职
  5. 风寒感冒与风热感冒的区分与治疗
  6. 全球首届“AI球球大作战:Go-Bigger多智能体决策智能挑战赛”开启
  7. 哎~~~又是RichTextBox
  8. php红色字体颜色,php生成文字颜色渐变 高级用法
  9. java监听焦点事件_【Java Swing公开课|Java Swing焦点事件监听器怎么用,看完这篇文章你一定就会了】- 环球网校...
  10. node soket.io + express + vue-soket.io 之间实现通信
  11. 如何使用BOOTSTRAP 栅格系统?
  12. 花书+吴恩达深度学习(二二)自编码器(欠完备,DAE,CAE,PSD)
  13. java怎么实现日程提醒_如何用java和xml实现日程提醒
  14. 读书笔记:陈希孺:概率论与数理统计:2014.01.01
  15. SqlDictionary表,使用SQL语句查询TableID
  16. webserver/CGI
  17. DNS服务双解析邮箱地址
  18. 类似铸剑物语的java游戏_怀旧向:GBA上的10款经典RPG游戏推荐,这些你都玩过吗?...
  19. 算法设计和分析 ② 分治和递归
  20. 如何采集苏宁易购买家订单?

热门文章

  1. 链表c++代码的实现
  2. 媒体智能-淘宝直播流媒体互动实践 | D2 分享视频+文章
  3. 对 SolarWinds 事件更深的思考:如何防御供应链攻击
  4. 开源应用诊断利器 Arthas GitHub Star 突破两万
  5. 鲜为人知的混沌工程,到底哪里好?
  6. 序列模型简介——RNN, Bidirectional RNN, LSTM, GRU
  7. 阿里云HBase携X-Pack再进化,重新赋能轻量级大数据平台
  8. ThinkPHP 5使用OSS
  9. 一把王者的时间,我就学会了Nginx
  10. 2019报告:AI程序员人才需求暴涨35倍!每10个公司就有6个人才缺口