PGDAC 4.5.14
When storing binary data in a BYTEA field with unpreparedExecute=True, the data is manipulated and corrupted. Please check out the following Testcode. Attached u have an example file (this is a DevExpress Filter File).
http://prodat-sql.de/tmp/Testfilter.dat
Can u reproduce the error?
Thanks, Daniel.
Code: Select all
procedure TForm1.Button4Click(Sender: TObject);
var
Data1, Data2: TFileStream;
B: Byte;
A1, A2: TBytes;
begin
Data1 := TFileStream.Create('S:\Testfilter.dat', fmOpenRead);
Data2 := TFileStream.Create('S:\Testfilter_pg.dat', fmCreate);
try
PgQuery2.Connection := DM1.DataBase1;
PgQuery1.Connection := DM1.DataBase1;
//PgQuery1.Options.UnknownAsString := True; // This one has no effect.
PgQuery1.Options.UnpreparedExecute := True; // The GUILTY.
PgQuery1.SQL.Text :=
'CREATE TABLE IF NOT EXISTS datatest ( '#10
+ ' ident SERIAL PRIMARY KEY, '#10
+ ' data BYTEA '#10
+ ');';
PgQuery1.Execute;
PgQuery1.Close;
PgQuery1.SQL.Text := 'SELECT * FROM datatest';
PgQuery1.Open;
PgQuery1.Locate('ident', 0, []);
PgQuery1.Edit;
PgQuery1.FieldByName('ident').AsInteger := 0;
//TBlobField(PgQuery1.FieldByName('data')).LoadFromFile('S:\Testfilter.dat');
TBlobField(PgQuery1.FieldByName('data')).LoadFromStream(Data1);
PgQuery1.Post;
PgQuery2.Close;
PgQuery2.SQL.Text := 'SELECT * FROM datatest WHERE ident = 0';
PgQuery2.Open;
//TBlobField(PgQuery2.FieldByName('data')).SaveToFile('S:\Testfilter_pg.dat');
TBlobField(PgQuery2.FieldByName('data')).SaveToStream(Data2);
Data2.Position := $34;
Data2.ReadBuffer(B, 1);
if B <> $85 then
ShowMessage('byte modified');
SetLength(A1, Data1.Size);
SetLength(A2, Data2.Size);
Data1.Position := 0;
Data2.Position := 0;
Data1.ReadBuffer(A1[0], Length(A1));
Data2.ReadBuffer(A2[0], Length(A2));
if (Length(A1) <> Length(A2)) or not CompareMem(@A1[0], @A2[0], Length(A1)) then
ShowMessage('data modified');
finally
Data1.Free;
Data2.Free;
end;
end;