3

场景:

我想在运行时将计算字段添加到给定的(任何)数据集。除了执行方法之外,我不知道任何其他方法来获取数据集结构DataSet.Open

但是该Open方法导致至少需要将一行数据从服务器传输到客户端。然后我需要关闭数据集,添加字段并重新打开它。在我看来,这是不必要的开销。有没有更好的方法来做到这一点?请不要说我希望能够向任何数据集添加计算字段,并且在打开之前我不知道它的结构。

在伪代码中它看起来像这样:

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

谢谢你的时间。

4

2 回答 2

12

您可以使用 DataSet.FieldDefs.Update 方法。这仍将涉及一些数据传输,但不会获取任何行。您可以在 TDataSet 的 BeforeOpen 事件中调用此方法,并在其中添加计算字段。

这是一个对我有用的简短示例:

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;
于 2010-02-23T09:27:48.500 回答
3

如果我能很好地理解你的问题;您想在调用 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)上。我希望这将有所帮助。

问候。

于 2010-02-23T11:53:44.603 回答