【发布时间】:2017-03-28 00:27:47
【问题描述】:
将字段添加到现有 TFDMemTable 后,任何通过 TFDLocalSQL 查询该表的 TFDQuery 都无法识别新字段。
下面的代码说明了这一点:在代码中添加了一个字段的 TFDMemTable 和在该表上执行选择的 TFDQuery。 (假设将 TFDMemTable 添加到 TFDLocalSQL 的 DataSets 属性并且 TFDQuery 指向 TFDConnection)将字段添加到实时 TFDMemTable 的过程来自example project 和使用 Unprepare,这似乎不起作用在这种情况下,来自这个question。
procedure TForm2.FormCreate(Sender: TObject);
begin
with FDMemTable1.FieldDefs.AddFieldDef do begin
Name := 'col1';
DataType := ftString;
Size := 10;
end;
FDMemTable1.CreateDataSet;
FDMemTable1.Active := true;
FDQuery1.SQL.Text := 'SELECT * FROM FDMemTable1';
FDConnection1.Connected := true;
FDLocalSQL1.Active := true;
FDQuery1.Active := true;
end;
procedure TForm2.Button1Click(Sender: TObject);
var
tempMT: TFDMemTable;
begin
tempMT := TFDMemTable.Create(nil);
try
tempMT.Data := FDMemTable1.Data;
FDMemTable1.Close;
with FDMemTable1.FieldDefs.AddFieldDef do begin
Name := 'col99';
DataType := ftString;
Size := 10;
end;
FDMemTable1.Open;
FDMemTable1.MergeDataSet(tempMT, dmDataSet, mmNone);
if not FDMemTable1.FieldDefs.Updated then FDMemTable1.FieldDefs.Update;
finally
tempMT.Free;
FDQuery1.Active := false;
FDQuery1.Unprepare; // this is meant to uncache the fields
FDQuery1.Active := true; // Does not include 'col99' in result set
end;
end;
该字段肯定已添加到 TFDMemTable 并且可以正常工作。关于如何让 TFDQuery 识别新列的任何提示。
【问题讨论】: