zoukankan      html  css  js  c++  java
  • 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;
  • 相关阅读:
    用gethub下载ardupilot的最新源码
    Mavlink协议理解
    Mavlink消息包解析
    Mavlink 协议 理解
    极飞P20农业无人机多机协同作业飞行
    如何下载最新的固件到Pixhawk
    韦东山笔记之用busybox构建根文件系统
    Visual studio 打包程序时添加自定义的系统必备组件
    MFC 编译链接错误:unresolved external symbol
    在Visual studio 2017中使用EF6连接MySQL
  • 原文地址:https://www.cnblogs.com/Jiaojiawang/p/12590564.html
Copyright © 2011-2022 走看看