Delphi在PostgreSQL中读写二进制数据


本文整理自网络,侵删。

 
我试图在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;

相关阅读 >>

Delphi fmx 切换窗体最大化

Delphi中判断某个文件是否已经打开

Delphi tdictionary 简单用法

Delphi 简单的字符串加密和解密

Delphi windows的消息传递--消息盒子

Delphi 字符串常识

Delphi fdquery遍历输出 json

Delphi读写xml的技巧

Delphi获取jpg图片的高度、宽度

Delphi 让窗口一直置顶,并且焦点也不移出

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...