我试图在Delphi中使用FireDAC读写PostgreSQL的二进制数据。
由于通常不使用PostgreSQL,因此可能会出现错误。
使用的应用程序版本如下。
Delphi版本是Delphi XE6
PostgreSQL版本是PostgreSQL 9.3.4(Win x86-32)
建立表格
创建一个表来存储二进制数据。
PostgreSQL似乎在bytea数据类型中存储二进制字符串。
create table myImage (jpegByte bytea);
数据库连接
放置一个TFDConnection以启用连接。
TFDTable设置
将FTTable1连接属性设置为“ FDConnection1”,并将TableName属性设置为“ myimage”。
检查是否可以将Active属性设置为True来建立连接。
打开FDTable1的字段编辑器,然后添加所有字段。
(已添加Jpegbyte。)
使用TBlobField的LoadFromFile方法保存二进制数据
尝试使用TBlobField的LoadFromFile方法保存二进制数据。
描述按下按钮时的事件。
在此代码中,预先准备的用于测试的JEPG文件(C:\ test \ test.jpg)保存在数据库中。
procedure TForm1.Button3Click(Sender: TObject);
begin
if not FDTable1.Active then
FDTable1.Active := True;
FDTable1.Append;
FDTable1jpegbyte.LoadFromFile('C:\test\test.jpg');
FDTable1.Post;
FDTable1.Active := False;
end;
使用TBlogField的LoadFromStream方法保存二进制数据
尝试使用TBlobField的LoadFromStream方法保存二进制数据。
描述按下按钮时的事件。
在此代码中,将预先准备的测试JEPG文件(C:\ test \ test.jpg)读取到流中,然后使用LoadFromStream方法将该流保存在数据库中。
procedure TForm1.Button4Click(Sender: TObject);
var
MS: TMemoryStream;
begin
if not FDTable1.Active then
FDTable1.Active := True;
FDTable1.Append;
MS := TMemoryStream.Create;
MS.LoadFromFile('C:\test\test.jpg');
FDTable1jpegbyte.LoadFromStream(MS);
MS.Free;
FDTable1.Post;
FDTable1.Active := False;
end;
使用TBlobField的SaveToFile方法将二进制数据保存到文件中
使用TBlobField的SaveToFile方法将二进制数据保存到文件中。
在代码末尾,将显示保存在TImage组件中的图像以供确认。
procedure TForm1.Button2Click(Sender: TObject);
const
PATH = 'C:\test\blob.jpg';
begin
if not FDTable1.Active then
FDTable1.Active := True;
FDTable1jpegbyte.SaveToFile(PATH);
FDTable1.Active := False;
Image1.Bitmap.LoadFromFile(PATH);
end;
使用TBlobField的SaveToStream方法保存到二进制数据流
尝试使用TBlobField的SaveToFile方法将二进制数据保存到流中。
流中保存的二进制数据将保存在文件中,然后显示在TImage组件中。
procedure TForm1.Button5Click(Sender: TObject);
const
PATH = 'C:\test\blob.jpg';
var
MS: TMemoryStream;
begin
if not FDTable1.Active then
FDTable1.Active := True;
if TFile.Exists(PATH) then
TFile.Delete(PATH);
MS := TMemoryStream.Create;
FDTable1jpegbyte.SaveToStream(MS);
FDTable1.Active := False;
MS.SaveToFile(PATH);
MS.Free;
Image1.Bitmap.LoadFromFile(PATH);
end;
使用TFDQuery保存二进制数据
使用TFDParam的LoadFromStream方法保存二进制数据。
procedure TForm1.Button1Click(Sender: TObject);
var
MS: TMemoryStream;
begin
MS := TMemoryStream.Create;
MS.LoadFromFile('C:\test\test.jpg');
MS.Seek(0, 0);
FDQuery1.SQL.Text := 'insert into myImage (jpegByte) values (:bData)';
FDQuery1.ParamByName('bData').LoadFromStream(MS, ftBlob);
FDQuery1.ExecSQL;
MS.Free;
end;
使用TFDQuery读取二进制数据
使用TFDQuery CreateBlobStream方法获取二进制数据作为TStream。
流数据保存在文件中,并显示在TImage组件上。
procedure TForm1.Button6Click(Sender: TObject);
const
PATH = 'C:\test\blob.jpg';
var
Stream: TStream;
MS: TMemoryStream;
begin
FDQuery1.Open('select jpegByte from myImage');
FDQuery1.First;
Stream := FDQuery1.CreateBlobStream(FDQuery1.FieldByName('jpegByte'),
TBlobStreamMode.bmRead);
MS := TMemoryStream.Create;
MS.LoadFromStream(Stream);
MS.SaveToFile(PATH);
MS.Free;
FDQuery1.Close;
Image1.Bitmap.LoadFromFile(PATH);
end;