如何使用FireDAC将Firebird数据库中的图像作为Blob加载到Delphi中的TImage?

时间:2015-11-09 16:28:59

标签: delphi blob firebird firedac timage

我在互联网上的很多地方搜索过但我找不到合适的解决方案。大多数示例使用其他组件或目标直接保存等。

我的问题是;我在服务器上有2个数据库,一个是产品信息(股票代码,名称,价格等),其他是产品图片(可以是jpeg,png,gif)。两个数据库都有一个独特的值来配对产品和图像(prod_id)。

我在表单上放了2个TFDConnection,2个TFDQuery和1个TDataSource组件,我从info数据库中获取数据并通过TDataSource,TFDConnection,TFDQuery和其他TFDConnection和TFDQuery组件将这些数据加载到StringGrid中以连接图像数据库

我想这样做;当我单击StringGrid上的一行时,让程序获取所选行的prod_id值(直到那里没有问题)然后搜索图像的数据库(如果有prod_id值,图像为blob(FILEDATA字段)在TImage控件上显示此图像)。

使用FireDAC组件有什么办法吗?或者我应该采取另一种方式?感谢。

1 个答案:

答案 0 :(得分:1)

如果您查看Delphi示例文件夹,您应该在名为BindGridLinkVCLProject的LiveBindings文件夹下找到一个示例(可能您已经在使用它了。)

这显示了如何使用实时绑定从StringGrid填充TDataSet,以及如何使用它来加载存储在数据库中的图像,基于{{{ 1}}。

它使用加载了标准(Borland)Biolife数据库(又名FishFacts)数据的StringGrid。我已经检查过,您可以用FireDAC替换ClientDataSet(我使用ClientDataSet,因为样本数据也包含其格式的Biolife DB)。正如Ken White在评论中所说,使用Firebird数据库不应该有任何区别(当然,除了你使用的FireDAC数据集类型之外)。

我还检查过你可以使用第二个FireDAC数据集进行查找以检索图像并将其加载到TFDMemTable中。以下显示了如何。

在BindGridLinkVCLProject演示项目中,数据的Graphic列包含 鱼的图片通过Livebinding显示在TImage

很容易调整此演示项目以从其他TImage检索图像 (尽管我在下面描述的内容中,我们只是使用Biolife数据集的第二个副本) 并使用FireDAC数据集而不是ClientDataSets。 (显然这是一个人为的例子,因为Biolife数据已经包含了图像数据,但以下内容表明,即使使用实时绑定,如果需要,也很容易从另一个数据集中检索图像。)

尝试以下方法:

  • 制作项目及其GridLinkFormUit1.Pas文件的副本。

  • TDataSet替换为ClientDataSet1

  • FDMemTableDataSource1位于BindSourceDB1

  • 从Biolife.Fds加载FDMemTable1(在IDE中右键单击它) 文件在Samples Data文件夹中。

此时,FDMemTable1应显示Biolife数据,StringGridWithBindColumns TImage应显示当前鱼的图片。现在,

  • 双击ImageWithHandler,然后在弹出窗口中删除BindingList1的绑定组件。我们将其添加到下面的单独BindingList中。

  • 向表单添加第二个FDMemTable,并使用与ImageWithHandler相同的数据加载它。

  • 在表单中添加第二个FDMemTable1DataSource。点BindingListDataSource2

  • 然后,双击FDMemTable2,并使用编辑器在两者之​​间添加新的绑定 BindingList2的{​​{1}}字段和Graphic TImage的字段(请参阅下面的DFM) 如何连接它。 Bindings编辑器应该自动创建FDMemTable2 您需要将其ImageWithHandlerBindSourceDB2属性设置为DataSetDataSource

然后,将以下代码添加到表单的单元中,编译并运行:

FDMemTable2

DFM提取物:

DataSource2