Lesen der Datensatzstruktur ohne Lesen der Daten
-
22-09-2019 - |
Frage
Szenerio:
Ich möchte während der Laufzeit ein berechnetes Feld zu einem (beliebigen) Datensatz hinzufügen. Ich kenne keinen anderen Weg, um eine andere Datensatzstruktur als die Ausführung zu erhalten DataSet.Open
Methode.
Aber die Open
Die Methode bewirkt, dass mindestens eine Zeile einer Daten vom Server zum Client übertragen werden muss. Dann muss ich das Datensatz schließen, das Feld hinzufügen und wieder eröffnen. Dies ist meiner Meinung nach ein unnötiger Overhead. Gibt es eine bessere Möglichkeit, dies zu tun? Bitte nicht, dass ich in der Lage sein möchte, einem Datensatz ein berechnetes Feld hinzuzufügen, und ich kenne seine Struktur vor dem Öffnen nicht.
In Pseudocode sieht es so aus:
DataSet.Open;
DataSet.Close;
RecreateFieldsStructure;
AddCalculatedField;
DataSet.Open;
Vielen Dank für Ihre Zeit.
Lösung
Sie können DataSet.fieldDefs.Update -Methoden verwenden. Dies beinhaltet weiterhin eine Datenübertragung, aber es werden keine Zeilen abgerufen. Sie können diese Methode im vorOpen -Ereignis des TDatasets aufrufen und dort auch die berechneten Felder hinzufügen.
Hier ist ein kurzes Beispiel, das für mich funktioniert:
procedure TDataModule.cdsExampleBeforeOpen(DataSet: TDataSet);
var I: Integer;
TmpField: TDateTimeField;
begin
// Get field definitions from the server
DataSet.FieldDefs.Update;
// Add calculated field
TmpField := TDateTimeField.Create(DataSet);
with TmpField do
begin
Name := 'Date';
FieldName := 'Date';
DisplayLabel := 'Date';
DisplayFormat := 'ddd ddddd';
Calculated := True;
end;
TmpField.DataSet := DataSet;
// Create fields from field definitions
for I := 0 to DataSet.FieldDefs.Count - 1 do
DataSet.FieldDefs[I].CreateField(DataSet);
end;
Andere Tipps
Wenn ich Ihre Frage gut verstehe; Sie möchten die Tabellenstruktur sehen/kennen, bevor Sie die Adoquery (Open) -Methode aufrufen. Wenn das, was Sie wollen, können Sie die Adoconnection -Methoden wie (getfieldnames) und hier ein Beispiel dafür verwenden, wie die Feldnamen der Tabelle (EMP) erhalten:
procedure TForm2.Button1Click(Sender: TObject);
var
lstFields: TStringList;
begin
lstFields := TStringList.Create;
try
ADOConnection1.GetFieldNames('EMP', lstFields);
finally
lstFields.Free;
end;
end;
Dann sind alle Feldernamen jetzt (LSTFields). Ich hoffe, das wird helfen.
Grüße.