Delphi读写Firebird二进制数据


本文整理自网络,侵删。

 
我试图在Delphi中使用FireDAC读写Firebird二进制数据。

使用的应用程序版本如下。

Delphi版本,Delphi XE6(FireMonkey桌面应用程序)
Firebird版本为Firebird 2.5.2
建立表格
创建一个表来存储二进制数据。
Firebird以BLOB数据类型存储二进制字符串。

BLOB数据类型有两种:二进制数据和长字符串。
为二进制数据指定“ SUB_TYPE BINARY”或“ SUB_TYPE 0”。
为长字符串指定“ SUB_TYPE TEXT”或“ SUB_TYPE 1”。

/*创建用于保存二进制数据的表格*/
CREATE TABLE MYIMAGE (JPEGBYTE BLOB SUB_TYPE BINARY);
数据库连接
放置一个TFDConnection以启用连接。


TFDTable设置
将FTTable1连接属性设置为“ FDConnection1”,并将TableName属性设置为“ MYIMAGE”。

检查是否可以将Active属性设置为True来建立连接。

打开FDTable1的字段编辑器,然后添加所有字段。
(已添加JPEGBYTE。)


使用TBlobField的LoadFromFile方法保存二进制数据
尝试使用TBlobField的LoadFromFile方法保存二进制数据。

描述按下按钮时的事件。
在此代码中,预先准备的用于测试的JEPG文件(C:\ test \ test.jpg)保存在数据库中。

procedure TForm1.Button1Click(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.Button3Click(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.Button2Click(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.Button5Click(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 为 service application 添加描述文本的方法

Delphi 如何从dll中检索导出函数的列表

Delphi pagecontrol.ttabsheet与drivecombobox.items同步

Delphi 防止系统睡眠

Delphi 调用外部 dll 中的函数(1. 早绑定)

Delphi 远程屏幕抓取的源代码

Delphi 获取系统服务列表

Delphi 获得当前进程所使用的内存

Delphi 通过注册表获取系统版本和cpu型号

Delphi的initialization和finalization

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



打赏

取消

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

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

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

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

评论

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