Wie gesagt, einfach die Daten (Records und Fields) in ein DataSet ohne
DB-Verbindung (MemTable) kopieren.
Delphi-Quellcode:
Q := Datamodule.OpenSql('
SELECT a, b FROM t');
try
MemData.Close;
// um den Inhalt schnell zu löschen, oder eben via "while MemData.RecordCount > 0 do MemData.Delete;" jeden Datensatz entfernen
MemData.Open;
// in MemData sind natürlich die gleichen Felder drin, wie im Query
// eventuell auch noch MemData.DisableControls und MemData.EnableControls verwenden
while not Q.EoF
do begin
MemData.Insert;
//TDatamodule.CopyAllFields(Q, MemData); // Wir haben uns ein paar Hilfsfunktionen gebaut, aber man kann auch direkt mir den Query-Komponenten arbeiten.
for i := 0
to Q.FieldCount - 1
do
MemData.Fields[i].Value := Q.Fields[i].Value;
{ oder, weil ich unten auch nur zwei Felder nutze
MemData.FieldByName['a'].Value := Q.FieldByName['a'].Value;
MemData.FieldByName['b'].Value := Q.FieldByName['b'].Value;
}
MemData.Post;
Q.Next;
end;
finally
Q.Free;
end;
Delphi-Quellcode:
//CacheList := TDirectory<string,string>.Create;
with Datamodule.OpenSql('SELECT a, b FROM t') do
try
CacheList.Clear;
while not EoF do begin
CacheList[AsString('a')] := AsString('b'); // bzw. FieldByName('a').AsString
Next;
end;
finally
Free;
end;
Also Daten abrufen (SELECT), die Dataset-Records durchlaufen und die Daten in der Liste speichern.
Und dann nur noch die Liste befragen
Delphi-Quellcode:
S := CacheList['irgendwas']; // Peng, wenn es 'irgendwas' nicht gibt. (könnte man aber auch auf "Leerstring wenn nicht vorhanden" umbauen)
if CacheList.Contains('irgendwas') then
S := CacheList['irgendwas'];
if CacheList.TryGet('irgendwas', X) then
S := X;
...
und wenn nötig den oberen Code nochmal ausführen, um die Liste zu aktualisieren.