データを読み取ることなくデータセット構造を読み取ります
-
22-09-2019 - |
質問
シーンリオ:
実行時間中に、指定された(任意の)データセットに計算されたフィールドを追加したいと思います。実行以外のデータセット構造を取得する他の方法は知りません DataSet.Open
方法。
しかし Open
メソッドは、少なくとも1つのデータの1行をサーバーからクライアントに転送する必要があります。次に、データセットを閉じてフィールドを追加して再開する必要があります。私の意見では、これは不必要なオーバーヘッドです。これを行うより良い方法はありますか?計算フィールドを任意のデータセットに追加できるようにしたいのではなく、開く前にその構造がわかりません。
Pseudocodeでは、次のようになります。
DataSet.Open;
DataSet.Close;
RecreateFieldsStructure;
AddCalculatedField;
DataSet.Open;
御時間ありがとうございます。
解決
dataset.fielddefs.updateメソッドを使用できます。これにはまだいくつかのデータ転送が含まれますが、行はありません。このメソッドを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;
他のヒント
私があなたの質問をよく理解しているなら。おしゃべり(オープン)メソッドを呼び出す前に、テーブル構造を確認/知りたいです。あなたが望むものなら、あなたは(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)になります。これが役立つことを願っています。
よろしく。
所属していません StackOverflow