之情况:
我想在运行时向给定(任意)数据集添加计算字段。除了执行DataSet.Open
方法之外,我不知道获取数据集结构的任何其他方法。
但Open
方法导致至少一行数据需要从服务器传输到客户端。然后我需要关闭DataSet,添加字段并重新打开它。在我看来,这是一个不必要的开销。有没有更好的方法呢?请注意,我不想在任何数据集中添加计算字段,而且在打开之前我不知道它的结构。
在伪代码中它看起来像这样:
DataSet.Open;
DataSet.Close;
RecreateFieldsStructure;
AddCalculatedField;
DataSet.Open;
感谢您的时间。
答案 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)上。我希望这会有所帮助。
问候。