Delphi - FieldByName.AsString - 良好的做​​法

RBA*_*RBA 5 delphi

我已经阅读了一篇博客文章(此时我找不到链接)作者说,分配局部变量比使用ADOQuery.FieldByName('...')更快.asString或TSQLQuery.FieldByName ('...').asString,在解析包含数千条记录的整个查询时.我没有看到它们之间的区别

var aLocalField: TField;
....
aLocalField := ADOQuery.FieldByName('...');
..
ShowMessage(aLocalField.asString)
Run Code Online (Sandbox Code Playgroud)

并直接使用

ShowMessage(ADOQuery.FieldByName('...').asString);
Run Code Online (Sandbox Code Playgroud)

博客文章没有说明数据库类型或Delphi版本.这个解决方案是否与一个或另一个相关(我不是在谈论模糊/自定义数据库系统)?

小智 17

两者之间没有明显的性能差异.我希望你发现的是它们之间的区别

DataSet.First;
while not DataSet.Eof do
begin
  ProcessValue(DataSet.FieldByName('Field').AsString);
  DataSet.Next;
end;
Run Code Online (Sandbox Code Playgroud)

Field := DataSet.FieldByName('Field');
DataSet.First;
while not DataSet.Eof do
begin
  ProcessValue(Field.AsString);
  DataSet.Next;
end;
Run Code Online (Sandbox Code Playgroud)

如果是这样,后者更有效,因为FieldByName(相对)慢的功能.如果您不需要多次调用它,请不要多次调用它.

  • 很高兴知道.顺便说一句2012年,仍然没有数据集的迭代器,生病只需再等10年. (2认同)

War*_* P 5

有意义的是:

  1. 如果您有一个CLASS(例如TForm)而不是本地函数,您可以持久地创建字段,以避免重复查找(FieldByName)的成本.

  2. 如果你不使用持久字段(在dfm中),你可以在运行时进行一次查找,并避免重复查找它的成本,如果在单个上下文中多次使用它(a)函数,或(b)在执行查询时可以查找一次,并将其存储在对象的受保护字段中,以便可以在查询或对象的生命周期中重复使用它.

你设想的例子没有任何好处,但我相信,当这些重复的逻辑查找被浪费时,重复查找字段可能是值得提及的"浪费".

我整天看到这样的代码,它让我疯狂:

procedure TSomething.DoSomething;
begin
    fDataset.FieldByName('X').AsString = fDataset.FieldByName('X').AsString+'Y';
end;
Run Code Online (Sandbox Code Playgroud)

通过这样的重复使上面的代码变得不那么可读,并且这种可读性问题以及错误检查问题是为什么我会避免上述情况,而是有一个fX:TField字段:

 TSomething = class(TBaseClass)
  protected
   fDataSet:TDataSet;
   fX:TField;

 end;
Run Code Online (Sandbox Code Playgroud)

现在我们可以写了

 fX.AsString := fX.AsString + 'Y';
Run Code Online (Sandbox Code Playgroud)

我认为人们对性能过分担心而质量不够,长期重复的子表达是"缺乏质量"和"缺乏思想"的标志,就像"缺乏对表现的关注"一样.