• TDBReader


    dataset.first
    while not dataset.eof do
    begin
       --N行代码
       dataset.next;
    end

    讨厌上面的写法了,作个封装.

     1 interface
     2 
     3 uses
     4   System.SysUtils, System.Classes, Data.DB;
     5 
     6 type
     7   IDBReader = interface
     8     ['{EC98E980-0044-4E7C-B583-B6341B7147E5}']
     9     function Next: Boolean;
    10     procedure Reset;
    11     function GetValue(name: string): TField;
    12     property Value[name: string]: TField read GetValue;
    13   end;
    14 
    15   TDBReader = class(TInterfacedObject, IDBReader)
    16   private
    17     FBeforeFirst: Boolean;
    18     FDataSet: TDataSet;
    19     function GetValue(name: string): TField;
    20   public
    21     constructor Create(ADataSet: TDataSet);
    22     destructor Destroy; override;
    23     function Next: Boolean;
    24     procedure Reset;
    25     property Value[name: string]: TField read GetValue;
    26   end;
    27 
    28 implementation
    29 
    30 { TDBReader }
    31 
    32 constructor TDBReader.Create(ADataSet: TDataSet);
    33 begin
    34   inherited Create;
    35   FBeforeFirst := True;
    36   FDataSet := ADataSet;
    37   FDataSet.First;
    38 end;
    39 
    40 destructor TDBReader.Destroy;
    41 begin
    42   FDataSet.Free;
    43   inherited;
    44 end;
    45 
    46 function TDBReader.GetValue(name: string): TField;
    47 begin
    48   Result := FDataSet.FieldByName(name);
    49 end;
    50 
    51 function TDBReader.Next: Boolean;
    52 begin
    53   if FBeforeFirst then
    54   begin
    55     FBeforeFirst := False;
    56     Result := not FDataSet.IsEmpty;
    57   end
    58   else
    59   begin
    60     FDataSet.Next;
    61     Result := not FDataSet.Eof;
    62   end;
    63 end;
    64 
    65 procedure TDBReader.Reset;
    66 begin
    67   FDataSet.First;
    68   FBeforeFirst := True;
    69 end;
    70 
    71 end.

     封装后代码少敲两行代码

    procedure TForm1.Button1Click(Sender: TObject);
    var
      R: TDBReader;
    begin
      R := ExecQuery('SELECT * FROM PUB_BMK');
      while R.Next do
        ListBox1.Items.Add(R.Value['bm'].AsString);
      R.Free;
    end;

     对比下面的,代码行数少4行.

    procedure TForm1.Button2Click(Sender: TObject);
    var
      ds: TDataSet;
    begin
      ds := ExecQuery2('select * from aaa');
      ds.First;
      while not ds.Eof do
      begin
        ListBox1.Items.Add(ds.FieldByName('f').AsString);
        Next;
      end;
      ds.Free;
    end;
  • 相关阅读:
    Linux 系统监控和诊断工具:lsof
    C语言基础(21)-C语言编译过程及GCC参数简介
    VS2013-解决VS2013 4996错误
    C语言基础(20)-文件操作(fopen,getc,fclose)
    eclipse-Java compiler level does not match the version of the installed Java project facet.
    C语言基础(19)-结构体,联合体,枚举和typedef
    android studio- Gradle "xxx" project refresh failed
    C语言基础(18)-内存
    C语言基础(17)-作用域
    android.app.Service-android:process=":remote"属性解说
  • 原文地址:https://www.cnblogs.com/Jiaojiawang/p/12590564.html
Copyright © 2020-2023  润新知