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;
原文地址:https://www.cnblogs.com/Jiaojiawang/p/12590564.html