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;
  • 相关阅读:
    安装VS 2015完成后,VS2012 打开报错
    ASP.NET MVC 项目中 一般处理程序ashx 获取Session
    windows平台 查看 dll 程序集 PublicKeyToken
    MySQL 表与字段编码格式报错
    Linux系统下安装MongoDB 指南
    ASP.NET 访问路径 错误提示 HTTP 错误 404.8 原来路径中包含bin目录被拒绝
    ASP.NET 大文件上传
    将类型(int,string,…)转换为 T 类型
    直接插入排序
    MySQL 优化之索引合并(index_merge)
  • 原文地址:https://www.cnblogs.com/Jiaojiawang/p/12590564.html
Copyright © 2011-2022 走看看