读取DataSet结构而不读取它的数据

时间:2010-02-23 09:18:27

标签: delphi dataset ado field calculated-field

之情况:

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

Open方法导致至少一行数据需要从服务器传输到客户端。然后我需要关闭DataSet,添加字段并重新打开它。在我看来,这是一个不必要的开销。有没有更好的方法呢?请注意,我不想在任何数据集中添加计算字段,而且在打开之前我不知道它的结构。

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

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

感谢您的时间。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:3)

如果我理解你的问题;您希望在调用ADOQuery(open)方法之前查看/了解表结构。如果您想要的话可​​以使用像(GetFieldNames)这样的ADOConnection方法,这里有一个如何获取表(EMP)字段名称的示例:

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

然后所有字段名称都在(lstFields)上。我希望这会有所帮助。

问候。