clientdataset 遍历字段_TClientDataSet[5]: 读取数据
本例用到:
TClientDataSet.Fields[]; { 字段集合; 它比 FieldList 有更多功能, 如可獲取嵌套字段 }
TClientDataSet.FieldList[]; { 字段列表; 它比 Fields 輕便, 如果只是取值用它快一些 }
TClientDataSet.FieldByName(); { 根據(jù)字段名稱獲取字段對象; 獲取一個字段對象時它比上兩個快 }
TClientDataSet.FindField(); { 根據(jù)字段名稱查找字段對象 }
TClientDataSet.FieldValues[]; { 根據(jù)字段名稱獲取字段值; 如果僅是獲取字段值, 這個最快 }
TClientDataSet.First; { 到第一個記錄 }
TClientDataSet.Next; { 到下一個記錄 }
TClientDataSet.Last; { 到最后一個記錄 }
TClientDataSet.Prior; { 到上一個記錄 }
TClientDataSet.RecNo; { 設(shè)置或讀取當(dāng)前記錄的位置 }
TClientDataSet.Bof; { 當(dāng)前位置是否是第一個記錄 }
TClientDataSet.Eof; { 當(dāng)前位置是否是最后一個記錄 }
TClientDataSet.RecordSize; { 一個記錄的大小; 所謂一個記錄就是當(dāng)前行的所有字段 }
TClientDataSet.RecordCount; { 記錄總數(shù); 也就是總行數(shù) }
TClientDataSet.GetFieldList(); { 根據(jù)指定的幾個字段名獲取字段對象的列表 }
TClientDataSet.GetFieldData(); { 把指定字段的值寫入一個緩沖區(qū) }
TClientDataSet.GetCurrentRecord(); { 把當(dāng)前記錄(不包括 Bolb 字段)寫入到一個緩沖區(qū) }
讀取字段的結(jié)構(gòu)信息可以使用 TFieldDef 對象(一般來源于 FieldDefs 或 FieldDefList);
現(xiàn)在要讀取其中的數(shù)據(jù), 應(yīng)該使用 TField 對象(一般來源于 Fields 或 FieldList).
Fields[0]、Fields[1] ... Fields[n] 獲取的是當(dāng)前行的第幾個字段, 可用 Next、RecNo 等指定當(dāng)前位置(行).
下面的例子使用了 Common Files\CodeGear Shared\Data\holdings.xml, 若更換文件需調(diào)整代碼.
這是 holdings.xml 的字段信息:
ACCT_NBR { 類型是 r8, 對應(yīng) ftFloat, 相當(dāng)于 Double }
SYMBOL { 類型是 string, 對應(yīng) ftString, 相當(dāng)于 AnsiString; 指定 Size=7, 加上空結(jié)束, 大小是 8 }
SHARES { 類型是 r8, 對應(yīng) ftFloat, 相當(dāng)于 Double }
PUR_PRICE { 類型是 r8, 對應(yīng) ftFloat, 相當(dāng)于 Double }
PUR_DATE { 類型是 date, 對應(yīng) ftInteger, 相當(dāng)于 Integer }
先窗體上放置 ClientDataSet1、DataSource1、DBGrid1、Memo1 和七個 Button, 然后:
{ 準(zhǔn)備數(shù)據(jù), 也可在設(shè)計時完成 }
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 是默認(rèn)的數(shù)組屬性 }
v6 := ClientDataSet1.FieldList[0].Value;
v7 := ClientDataSet1.FieldList.FieldByName(fName).Value;
v8 := ClientDataSet1.FieldList.Find(fName).Value;
v9 := ClientDataSet1.FieldList.Fields[0].Value;
{ 已知這個字段是 Double 類型的, 可同時轉(zhuǎn)換 }
num := ClientDataSet1.Fields[0].AsFloat;
{ 查看結(jié)果 }
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;
{ 遍歷當(dāng)前行字段的幾種方法 }
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;
{ 讀取倒數(shù)第二行第二個字段 }
ClientDataSet1.Last;
ClientDataSet1.Prior;
s2 := ClientDataSet1.Fields[1].AsString;
{ 讀取第四行第二個字段 }
ClientDataSet1.RecNo := 4;
s3 := ClientDataSet1.Fields[1].AsString;
{ 查看結(jié)果 }
with Memo1.Lines do begin
Clear;
Add('第二行第二個字段: ' + s1);
Add('倒數(shù)第二行第二個字段: ' + 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;
//這是后面的例子用到的函數(shù), 轉(zhuǎn)換 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 是把當(dāng)前行的所有字段(不包括 Blob 字段)讀入到緩沖區(qū) }
procedure TForm1.Button7Click(Sender: TObject);
type
THoldingsStruct = packed record { 這是根據(jù) holdings.xml 建立的數(shù)據(jù)結(jié)構(gòu) }
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; { 它后面還若干字節(jié)偏移, 測試時其字節(jié)數(shù)等于前面的字段數(shù) }
end;
var
buf: THoldingsStruct;
DateTimeRec: TDateTimeRec;
begin
//ShowMessage(IntToStr(ClientDataSet1.RecordSize)); { 可通過這個值對照上面的結(jié)構(gòu) }
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;
總結(jié)
以上是生活随笔為你收集整理的clientdataset 遍历字段_TClientDataSet[5]: 读取数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小程序获取openid保存缓存吗_微信小
- 下一篇: python dataframe删除某一