本例用到:
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;
分享到:
相关推荐
2. **从本地另一个数据集中获取数据**:可以在客户端创建一个数据集,并将其作为TClientDataSet的数据源。 3. **通过 IProvider 接口从远程数据库服务器获取数据**:这是最常见的使用场景之一,通过中间层的...
在这个系统中,开发者可能使用了TADOConnection、TADOQuery、TADODataset等组件来实现数据的读取、写入和更新操作。TADOConnection组件负责建立数据库连接,TADOQuery则用于执行SQL查询语句,而TADODataset则作为...
Delphi 还提供了 VCL(Visual Component Library)组件,如 TClientDataSet 和 TDataSource,它们可以在内存中管理和操作数据。这些组件可以连接到各种数据库驱动,提供了一种更高级的方式来处理内存中的数据。 ...
5. **Project1.dpr**:这是Delphi项目的主要执行文件,包含了项目的初始化代码和运行时设置。在这个文件中,通常会创建应用程序实例、设置窗口图标、加载数据库连接和启动主窗体等。 6. **Unit1.dfm**和**Unit1.pas...
标题 "Delphi 7数据库内容导出至Excel表格源码" 涉及到的是一个在 Delphi 7 开发环境中实现的程序,该程序能够从SQL Server 2000数据库中读取数据并将其导出到Excel电子表格中。这个功能在数据管理和分析工作中极其...
本篇文章将详细讲解如何在Delphi环境下读取Excel文件并将其内容加载到数据集中。 首先,我们需要理解的是,Delphi是一款强大的Object Pascal编程环境,它提供了丰富的组件库来处理各种任务,包括文件操作。对于...
5. **读取图像数据**: - 当查询到包含图像的记录时,可以通过 TBlobField 的方法来读取数据。例如,你可以使用 `LoadFromStream` 方法,先创建一个 TMemoryStream 对象,然后调用 `ImageField.LoadFromStream...
3. 数据集组件:TDataSet和其子类如TClientDataSet是Delphi中用于处理数据库数据的核心组件。它们提供了数据的读取、写入、导航和过滤功能。源码中可能会展示如何将查询结果绑定到这些组件,以及如何使用它们进行...
综上所述,Delphi 中实现类似于 .NET Dataset 的数据集功能,主要依赖于 TClientDataSet 和 TDBDataSet 组件,它们提供了丰富的功能,可以满足内存数据处理和数据库交互的需求。通过动态创建和配置这些数据集,...
2. **创建数据集对象**:根据需要,选择TClientDataSet或TDataset的子类,如TTable、TQuery等,用于从数据库中读取数据。设置其DataSource属性,与数据连接相关联。 3. **定义查询**:在TQuery或TSQLQuery组件中...
总的来说,这个主题涵盖了Delphi编程的多个重要方面:数据流的处理、数据库的连接和操作,以及数据恢复策略。通过深入研究和实践,开发者可以提升在这些领域的专业技能,创建高效、可靠且安全的数据库应用程序。
5. **保存到数据库**:当Blob字段被赋值后,调用TDataSet的Post方法将数据提交到数据库。这样,文件内容就被存储到Blob字段中了。 6. **读取数据库中的Blob数据**:从数据库读取Blob数据时,可以创建一个新的...
5. **内存数据集**:如果不需要实时连接到数据库,可以使用TClientDataSet组件存储查询结果。这样可以在断开数据库连接后仍然可以操作数据,适合离线应用或数据缓存。 6. **性能优化**:为了提高查询性能,应尽量...
1. **数据访问组件(Data Access Components, DACs)**:Delphi提供了一系列的数据访问组件,如TClientDataSet,TDataSource等,它们是连接数据库和应用程序界面的桥梁。TClientDataSet允许离线数据操作,而...
在本示例中,"Delphi读取数据库统计销售记录.rar" 是一个使用Delphi编程语言编写的项目,旨在教初学者如何从数据库中提取数据并进行销售记录的统计分析。Delphi是一款强大的Windows应用程序开发工具,它基于Object ...
- **数据持久化**:使用DataSet组件,如TClientDataset,进行数据的缓存和离线操作,提高系统响应速度。 - **报表生成**:利用第三方组件,如FastReport或DevExpress,生成各种统计报表,便于管理层分析决策。 4....
8. **使用数据集(Dataset)**:如果数据是结构化的,可以考虑使用数据库连接或内存中的数据集(如TDataset或TClientDataSet)。这样,多个窗体可以通过共享同一个数据集来读取和修改数据。 9. **使用设计时组件...
- **填充`TClientDataSet`**:将读取到的字段值添加到`TClientDataSet`中,模拟数据插入操作。可以使用`TClientDataSet.Append`方法开始新的一行,然后逐个设置字段值。 - **提交数据**:一旦`TClientDataSet`...
这个“ODAC_6.25 for Delphi 5-11 and BCB5-6”版本是针对Delphi 5到Delphi 11以及BCB5到BCB6的应用程序开发者的。它提供了全面的数据库连接功能,使开发者能够在这些IDE环境下创建与Oracle数据库交互的应用程序。 ...
通过ADO,开发者可以直接与ODBC(Open Database Connectivity)兼容的数据库进行交互,包括SQL Server、Oracle、MySQL等,实现数据的读取、写入和查询。 4. 数据绑定:Delphi 6中的数据绑定机制允许开发者将数据库...