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;