2010-02-23 56 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