Чтение структуры набора данных без чтения данных
-
22-09-2019 - |
Вопрос
Сторон:
Я хочу добавить рассчитанное поле к данному (любому) набору данных во время выполнения. Я не знаю другого способа получить структуру набора данных, кроме как выполнение DataSet.Open
метод
Но Open
Метод приводит к тому, что по крайней мере одна строка данных должна быть передана с сервера на клиент. Затем мне нужно закрыть набор данных, добавить поле и открыть его. На мой взгляд, это ненужные накладные расходы. Есть ли лучший способ сделать это? Пожалуйста, не то чтобы я хочу иметь возможность добавить поле в калькуляции в любой набор данных, и я не знаю его структуры до открытия.
В псевдокоде это выглядит так:
DataSet.Open;
DataSet.Close;
RecreateFieldsStructure;
AddCalculatedField;
DataSet.Open;
Спасибо за ваше время.
Решение
Вы можете использовать DataSet.fieldDefs.update Метод. Это все равно будет включать в себя передачу данных, но строки не будут извлечены. Вы можете назвать этот метод в событии TENOPEN 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;
Другие советы
Если я хорошо понимаю ваш вопрос; Вы хотите увидеть/знать структуру таблиц, прежде чем вызывать метод 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). Я надеюсь, это поможет.
С Уважением.