La lecture structure DataSet sans lire les données de it
-
22-09-2019 - |
Question
Scenerio:
Je veux ajouter un champ calculé à ensemble de données (tout) lors de l'exécution. Je ne connais pas d'autre moyen d'obtenir une structure d'ensemble de données autres que l'exécution de la méthode DataSet.Open
.
Mais la méthode Open
fait que atleast une ligne de données doivent être transférées du serveur au client. Ensuite, je dois fermer le DataSet, ajouter le champ et le rouvrir. Ceci est une surcharge unnecessery à mon avis. Existe-t-il une meilleure façon de le faire? S'il vous plaît pas que je veux être en mesure d'ajouter un champ calcuated à un ensemble de données et je ne sais pas sa structure avant l'ouverture.
Dans ce pseudocode ressemble à ceci:
DataSet.Open;
DataSet.Close;
RecreateFieldsStructure;
AddCalculatedField;
DataSet.Open;
Merci pour votre temps.
La solution
Vous pouvez utiliser la méthode DataSet.FieldDefs.Update. Cela implique encore un certain transfert de données, mais aucune ligne ne sera tiré par les cheveux. Vous pouvez appeler cette méthode en cas BeforeOpen du TDataSet et ajoutez également les champs calculés là.
Voici un court exemple qui fonctionne pour moi:
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;
Autres conseils
Si je comprends bien votre question; vous voulez voir / connaître la structure des tables avant d'appeler la méthode ADOQuery (ouverte). si ce que vous voulez, vous pouvez utiliser les méthodes de ADOConnection comme (GetFieldNames) et voici un exemple de la façon d'obtenir les noms des champs de la table (EMP):
procedure TForm2.Button1Click(Sender: TObject);
var
lstFields: TStringList;
begin
lstFields := TStringList.Create;
try
ADOConnection1.GetFieldNames('EMP', lstFields);
finally
lstFields.Free;
end;
end;
alors tous les noms des champs sont maintenant sur (lstFields). J'espère que cela vous aidera.
Cordialement.