기존 TFDMemTable에 필드를 추가 한 후 TFDLocalSQL을 통해 해당 테이블을 쿼리하는 TFDQuery가 새 필드를 인식하지 못합니다.새 필드가 TFDLocalSQL을 통해 쿼리하는 TFDMemTable에 추가 될 때 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에서 새 열을 인식하는 방법에 대한 정보.
감사합니다. 그 이유는 이해하지 못했지만 효과가있었습니다. 이전에 작동하지 않는 TFDConnection을 분리했다가 다시 연결하려고했습니다. 또한 CheckActivate 소스를 다르게 읽습니다 - TFDLocalSQL은 TFDConnection이 활성화되어 있지 않은 한 활성화 할 수 없습니다. * 권장되는 활성화 순서와 맞습니다. 다시 한 번 감사드립니다. –