zoukankan      html  css  js  c++  java
  • 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 字段)写入到一个缓冲区 }
    

    读取字段的结构信息可以使用 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;
    
  • 相关阅读:
    学习方法与经验总结
    工具综合症?资料收集狂?
    SpringMVC 过滤器Filter使用解析
    Spring 管理Filter和Servlet
    pom.xml配置详解
    开发Java web应用程序的介绍
    java web构建学习(概念基础)
    题目1474:矩阵幂
    题目1473:二进制数
    Python strip()方法
  • 原文地址:https://www.cnblogs.com/del/p/1654475.html
Copyright © 2011-2022 走看看