diff --git a/packages/fcl-db/src/base/bufdataset.pas b/packages/fcl-db/src/base/bufdataset.pas index e38b5f2ff6..7d9bf54090 100644 --- a/packages/fcl-db/src/base/bufdataset.pas +++ b/packages/fcl-db/src/base/bufdataset.pas @@ -2733,26 +2733,30 @@ begin end; procedure TCustomBufDataset.CreateDataset; +var AStoreFilename: string; + begin CheckInactive; - if not ((FieldCount=0) or (FieldDefs.Count=0)) then + if ((FieldCount=0) or (FieldDefs.Count=0)) then begin - Open; - Exit; + if (FieldDefs.Count>0) then + CreateFields + else if (fields.Count>0) then + begin + InitFieldDefsFromfields; + BindFields(True); + end + else + raise Exception.Create(SErrNoFieldsDefined); end; - if (FieldDefs.Count>0) then - begin - CreateFields; + // When a filename is set, do not read from this file + AStoreFilename:=FFileName; + FFileName := ''; + try Open; - end - else if (fields.Count>0) then - begin - InitFieldDefsFromfields; - BindFields(True); - Open; - end - else - raise Exception.Create(SErrNoFieldsDefined); + finally + FFileName:=AStoreFilename; + end; end; function TCustomBufDataset.BookmarkValid(ABookmark: TBookmark): Boolean; @@ -2772,8 +2776,12 @@ end; procedure TCustomBufDataset.IntLoadFielddefsFromFile; begin + FieldDefs.Clear; FDatasetReader.LoadFielddefs(FieldDefs); - if DefaultFields then CreateFields; + if DefaultFields then + CreateFields + else + BindFields(true); end; procedure TCustomBufDataset.IntLoadRecordsFromFile; diff --git a/packages/fcl-db/tests/testbufdatasetstreams.pas b/packages/fcl-db/tests/testbufdatasetstreams.pas index a510fd8f35..c42fc15a24 100644 --- a/packages/fcl-db/tests/testbufdatasetstreams.pas +++ b/packages/fcl-db/tests/testbufdatasetstreams.pas @@ -71,6 +71,7 @@ type procedure TestDeleteAllInsertXML; procedure TestStreamingBlobFieldsXML; procedure TestStreamingBigBlobFieldsXML; + procedure TestStreamingCalculatedFieldsXML; procedure TestAppendDeleteBIN; @@ -543,6 +544,35 @@ begin end; end; +procedure TTestBufDatasetStreams.TestStreamingCalculatedFieldsXML; +var + ADataset: TCustomBufDataset; + f: tfield; +begin + ADataset := DBConnector.GetNDataset(true,10) as TCustomBufDataset; + f := TIntegerField.Create(ADataset); + f.FieldName:='ID'; + f.dataset := ADataset; + + f := TIntegerField.Create(ADataset); + f.FieldName:='CalcID'; + f.dataset := ADataset; + f.FieldKind:=fkCalculated; + + f := TStringField.Create(ADataset); + f.FieldName:='NAME'; + f.dataset := ADataset; + + ADataset.Open; + ADataset.SaveToFile('FieldsDS.xml',dfXML); + ADataset.Close; + + ADataset.LoadFromFile('FieldsDS.xml',dfXML); + AssertEquals(ADataset.FieldByName('ID').AsInteger,1); + AssertEquals(ADataset.FieldByName('NAME').AsString,'TestName1'); + ADataset.Close; +end; + procedure TTestBufDatasetStreams.TestAppendDeleteBIN; begin TestChanges(@AppendDeleteChange);