Zitat:
Locate ist meistens ein blödes Verfahren, weil eben alle Records zum Client geliefert werden, bis derjenige kommt, den du haben wolltest
Um Mißverständnissen vorzubeugen. Das war zu Zeiten der
BDE. IBObjects zum Beispiel ist da viel cleverer. IBDac eventuell auch. Ist mit der Trace
API nun alles schön transparent, was da von den Zugriffskomponenten teilweise verbrochen wird. Aber das Thema Trace
API wurde ja bereits erwähnt ...
hier mal ein Ausschnit aus der aktuelle Implementation TCustomSQLDataSet.LocateRecord
in XE4
unit Data.SqlExpr, das sieht mir nicht besonders clever aus.
Der rennt sogar zwei mal durch die Datenmenge, wenn beim ersten Durchlauf keine
Übereinstimmmung gefunden wurde. Und diese Implementation ist leider nicht unüblich,
auch wenn andere Komponenten das ggf irgendwie anders lösen, da sollte man sich aber
nicht drauf verlassen.
Code:
First;
while not EOF do
begin
if CheckValues(AFields, Values, CaseInsensitive, PartialLength) then
break;
Next;
end;
{ if not found, reset cursor to starting position }
bFound := not EOF;
if not bFound then
begin
First;
while not EOF do
begin
if CheckValues(SaveFields, StartValues, False, False) then
break;
Next;
end;
end;
Result := bFound;
"Das war zu Zeiten der
BDE" ist da also doch nicht ganz zutreffend ...