2010-02-23 1 views
3

Scenerio:Чтения DataSet структура, не читая свои данные

Я хочу добавить вычисляемое поле в данном (любом) набор данных во время выполнения. Я не знаю другого способа получить структуру набора данных, кроме метода DataSet.Open.

Но метод Open приводит к тому, что по крайней мере одна строка данных должна быть передана от сервера к клиенту. Затем мне нужно закрыть DataSet, добавить поле и снова открыть его. На мой взгляд, это лишние накладные расходы. Есть ли лучший способ сделать это? Пожалуйста, не хочу, чтобы я мог добавлять исчисляемое поле в любой набор данных, и я не знаю его структуры до открытия.

В псевдокоде это выглядит следующим образом:

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

Спасибо за ваше время.

ответ

11

Вы можете использовать метод DataSet.FieldDefs.Update. Это все равно будет связано с некоторыми передачами данных, но никакие строки не будут извлечены. Вы можете вызвать этот метод в событии BeforeOpen TDataSet, а также добавить туда вычисленные поля.

Вот краткий пример, который работает для меня:

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. Хорошо знать. –

+0

Спасибо, именно то, что я хотел. +1 – Wodzu

3

Если я правильно понял ваш вопрос хорошо; вы хотите увидеть/узнать структуру таблиц до вызова метода ADOQuery (open). если это то, что вы хотите, вы можете использовать методы ADOConnection как (GetFieldNames) и вот пример того, как получить имена полей таблицы (ЭМИ):

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

тогда все имена полей теперь на (lstFields) , Я надеюсь, это поможет.

С уважением.

+0

Спасибо Исам, к сожалению, этот метод дает мне имена полей, которых недостаточно для воссоздания структуры набора данных. Мне также нужен тип определенного поля. В любом случае, я даю +1, потому что это полезный метод. – Wodzu