2010-02-23 77 views
3

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

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

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

伪代码,它看起来是这样的:

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

感谢您的时间。

回答

11

您可以使用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; 
+0

+1。很高兴知道。 – 2010-02-23 09:45:25

+0

谢谢,正是我想要的。 +1 – Wodzu 2010-02-23 12:33:40

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) 。我希望这将有所帮助。

问候。

+0

感谢Issam,不幸的是,这种方法只给了我不足以重新创建数据集结构的字段名称。我还需要一种特定的领域。无论如何,我给+1导致它是有用的方法。 – Wodzu 2010-02-23 12:35:51