Reading a DataSet without reading data

Scenerio:

I want to add a calculated field to a given (any) dataset at runtime. I do not know of any other way to get a data set structure different from the method execution DataSet.Open.

But the method Opencauses at least one row of data to be transmitted from server to client. Then I need to close the DataSet, add a field and reopen it. In my opinion, this is an extra overhead. Is there a better way to do this? Please do not want me to be able to add a calculated field to any data set, and I do not know its structure before opening.

In pseudo code, it looks like this:

DataSet.Open;
DataSet.Close;
RecreateFieldsStructure;
AddCalculatedField;
DataSet.Open;

Thank you for your time.

+3
2

DataSet.FieldDefs.Update. , . BeforeOpen TDataSet, .

, :

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;
+12

; / ADOQuery (open). , , ADOConnection, (GetFieldNames), , (EMP):

procedure TForm2.Button1Click(Sender: TObject);
var
  lstFields: TStringList;
begin
  lstFields := TStringList.Create;
  try
    ADOConnection1.GetFieldNames('EMP', lstFields);
  finally
    lstFields.Free;
  end;
end;

(lstFields). , .

.

+3

Source: https://habr.com/ru/post/1734018/


All Articles