0

我在互联网上搜索了很多地方,但我还没有找到合适的解决方案。大多数示例使用其他组件或旨在直接保存等。

我的问题是;我在服务器上有 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 组件做到这一点?还是我应该遵循另一种方式?谢谢。

4

1 回答 1

1

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

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

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

我还检查了您是否可以使用第二个 FireDAC 数据集进行查找以检索图像并将其加载到 aTImage中。下面展示了如何。

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

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

尝试以下操作:

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

  • 替换ClientDataSet1FDMemTable.

  • DataSource1BindSourceDB1FDMemTable1

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

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

  • 双击BindingList1并在弹出窗口中删除ImageWithHandler. 我们将把它添加到下面的单独的 BindingList 中。

  • 向表单添加第二个 FDMemTable 并使用与FDMemTable1.

  • 在表单中添加第二个DataSourceBindingList。指向。DataSource2_ FDMemTable2

  • 然后,双击,并使用编辑器在字段 of和TImageBindingList2之间添加一个新的绑定(请参阅下面的 DFM 了解如何连接它。绑定编辑器应该自动创建 ,您需要将其和属性设置为and 。GraphicFDMemTable2ImageWithHandlerBindSourceDB2DataSetDataSourceFDMemTable2DataSource2

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

  TGridLinkForm1 = class(TForm)
    [...]
  public
    { Public declarations }
    DataFileName : String;
  end;


procedure TGridLinkForm1.FormCreate(Sender: TObject);
begin
  DataFileName := 'D:\xe8\samples\Data\Biolife.Fds';
  if not FDMemTable2.Active then
    FDMemTable2.LoadFromFile(DataFileName);
  if not FDMemTable1.Active then
    FDMemTable1.LoadFromFile(DataFileName);
end;

procedure TGridLinkForm1.FDMemTable1AfterScroll(DataSet: TDataSet);
var
  SpeciesNo : Double;
begin
  SpeciesNo := FDMemTable1.FieldByName('Species No').AsFloat;
  if not FDMemTable2.Locate('Species No', SpeciesNo, []) then
    raise Exception.CreateFmt('SpeciesNo %n not found in %s', [SpeciesNo, FDMemTable2.Name]);
end;

DFM 提取物:

  object FDMemTable2: TFDMemTable
    FetchOptions.AssignedValues = [evMode]
    FetchOptions.Mode = fmAll
    ResourceOptions.AssignedValues = [rvPersistent, rvSilentMode]
    ResourceOptions.Persistent = True
    ResourceOptions.SilentMode = True
    UpdateOptions.AssignedValues = [uvCheckRequired]
    UpdateOptions.CheckRequired = False
    Left = 24
    Top = 392
  end
  object DataSource2: TDataSource
    DataSet = FDMemTable2
    Left = 88
    Top = 392
  end
  object BindSourceDB2: TBindSourceDB
    DataSource = DataSource2
    ScopeMappings = <>
    Left = 236
    Top = 392
  end
  object BindingsList2: TBindingsList
    Methods = <>
    OutputConverters = <>
    Left = 152
    Top = 392
    object LinkControlToField1: TLinkControlToField
      Category = 'Quick Bindings'
      DataSource = BindSourceDB2
      FieldName = 'Graphic'
      Control = ImageWithHandler
      Track = False
    end
  end
于 2015-11-10T16:59:15.517 回答