Assigning data to TBlobField does not save data to field until record is Posted
Original Reporter info from Mantis: lacak @lacak.sk
-
Reporter name: LacaK
Original Reporter info from Mantis: lacak @lacak.sk
- Reporter name: LacaK
Description:
When data are assigned to TBlobField using f.e AsString:='...' and later are read back, data are not there until record is Posted. See Steps To Reproduce.
In background: when BlobStream is created, new entry into UpdateBlobBuffers is added and data are saved there (as they are written to stream). When record is posted this new blob update buffer is linked to blob field in active record.
But before post, blob field links still to original blob buffer (not to new created).
Patches: rev.26604, 26611
Steps to reproduce:
Create TBufDataSet with any TBlobField f.e. named 'blob':
CreateDataSet;
bf:=FieldByName('blob');
Append;
bf.AsString:='data1';
Post;
writeln(bf.AsString); // "data1" OK
Edit;
bf.AsString:='data2';
writeln(bf.AsString); // "data1" but expected "data2" !!!
Post;
writeln(bf.AsString); // "data2" OK
Additional information:
In DXE with TClientDataSet:
Example1:
CreateDataSet;
bf:=FieldByName('blob');
Append;
bf.AsString:='data1';
Post;
writeln(bf.AsString); // "data1" OK
Edit;
bf.AsString:='data2';
writeln(bf.AsString); // "data2" OK
Post;
writeln(bf.AsString); // "data2" OK
Example2:
Edit;
with CreateBlobStream(bf, bmWrite) do begin // bf.ReadOnly is checked here
s := 'blob123';
WriteBuffer(s[1], length(s));
WriteBuffer(s[1], length(s));
Free; // bf.OnChange is generated only once here, when stream is destroyed (not on each WriteBuffer)
end;
Post;
// bf.OnValidate is never generated (which is IMO bug in DXE)
Mantis conversion info:
- Mantis ID: 25648
- Version: 2.7.1
- Fixed in version: 3.0.0
- Fixed in revision: 26611 (#1034503c)
- Target version: 3.0.0