Lettura struttura DataSet senza leggerlo di dati
-
22-09-2019 - |
Domanda
Scenerio:
Voglio aggiungere un campo calcolato alla data (qualsiasi) set di dati durante il runtime. Non conosco nessun altro modo per ottenere una struttura di dati diverso da eseguire metodo DataSet.Open
.
Ma il metodo Open
fa sì che almeno uno fila di un dati deve essere trasferito dal server al client. Poi ho bisogno di chiudere il DataSet, aggiungere il campo e riaprirlo. Si tratta di un sovraccarico unnecessery a mio parere. C'è un modo migliore di fare questo? Si prega di non che io voglio essere in grado di aggiungere un campo calcuated a qualsiasi insieme di dati e non so la sua struttura prima dell'apertura.
In pseudocodice Sembra che questo:
DataSet.Open;
DataSet.Close;
RecreateFieldsStructure;
AddCalculatedField;
DataSet.Open;
Grazie per il vostro tempo.
Soluzione
È possibile utilizzare il metodo DataSet.FieldDefs.Update. Questo sarà ancora comporta alcun trasferimento di dati, ma nessuna riga sarà recuperato. È possibile chiamare questo metodo in caso BeforeOpen del TDataSet e anche aggiungere i campi calcolati lì.
Ecco un breve esempio che funziona per me:
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;
Altri suggerimenti
Se ho capito bene la tua domanda; si vuole vedere / conoscere la struttura tabelle prima di chiamare il metodo ADOQuery (aperto). se è ciò che si desidera è possibile utilizzare i metodi ADOConnection come (GetFieldNames) e qui un esempio di come ottenere i nomi dei campi della tabella (EMP):
procedure TForm2.Button1Click(Sender: TObject);
var
lstFields: TStringList;
begin
lstFields := TStringList.Create;
try
ADOConnection1.GetFieldNames('EMP', lstFields);
finally
lstFields.Free;
end;
end;
quindi tutti i nomi i campi sono ora in poi (lstFields). Spero che questo vi aiuterà.
Saluti.