【问题标题】:How to save a blob to a file in Delphi FireDAC SQLite如何在 Delphi FireDAC SQLite 中将 blob 保存到文件中
【发布时间】:2021-07-10 02:44:06
【问题描述】:

我的 Delphi 10.4.2 项目使用以下代码将 .WAV 文件的内容存储在 SQLite3 数据库 blob 字段中:

fSQLite3Query: TFDQuery;

fSQLite3Query.ParamByName(kSQLFieldMultimediaFileContents).LoadFromFile(MultimediaFileName, ftBlob);

SELECT * 查询成功后,使用什么代码将该字段的内容保存回文件中?

【问题讨论】:

  • Params 仅适用于查询,不适用于结果集。为此,您使用FieldByName 和表中的字段(列)名称或您在查询中使用的别名,或您定义的持久字段(有关它们的更多信息,请参见 MartynA 的答案)。您可以找到一个使用 TBlobField here 的示例 - 只需将 ADOQuery 替换为您的 FDQuery。
  • 谢谢@KenWhite,这两点都很好。
  • 谢谢@KenWhite。从您关于 TBlobField 的链接中,我得到了以下代码: theBlobField := TBlobField(fSQLite3Query.FieldByName(kSQLFieldMultimediaFileContents)); theBlobField.SaveToFile(MultimediaFileName);

标签: sqlite delphi blob delphi-10.4-sydney


【解决方案1】:

您可以使用TBlobFieldSaveToFile 来执行此操作。显然,如果您在 Delphi IDE 中设置持久 TField,包括相关字段上的 TBlobField,这是最简单的。

http://docwiki.embarcadero.com/Libraries/Sydney/en/Data.DB.TBlobField.SaveToStream

MyBlobField.SaveToFile('c:\temp\somewavfile.wav');

更新我从您的评论中得知,您在将我所说的内容与您的代码联系起来时遇到了问题,所以我会尽可能清楚地解释这一点。

当您使用 Sql 查询打开 FDQuery 时,除非您采取措施使 FDQuery 表现不同,否则它将在 Sql 的结果集中为每列创建一个 TField-descendant 字段。 FireDAC 使用来自服务器的元数据来确定它为每个 Sql 列创建的 TField 后代(例如 TIntegerField、TStringField、TBlobField)。只要您在 FDQuery 上调用 .Close(),FDQuery 就会释放字段。

另一种工作方式是创建“持久”字段,即使关闭 FDQuery 也会继续存在。这样做的主要原因是为了让您在设计时知道结果集的每一列使用哪种类型的 TField-descendant 并设置某些行为(如字段的显示格式)。要设置持久 TField,您可以这样做:

  • 在 IDE 中,右键单击 FDQuery,然后单击弹出窗口中的Fields editor...
  • 然后,您将看到Fields editor 弹出窗口。
  • 右键单击它并从上下文菜单中选择Add all fields
  • Fields editor 然后将为 Sql 结果集中的每一列填充一个字段。 (此时您还可以根据需要手动添加计算字段和查找字段)。

完成所有这些后,您会发现字段显示在对象检查器中,每个字段都有一个组件名称,该名称基于 FDQuery 的名称和 Sql 查询的相关列名称的组合。希望对于您包含 .WAV 文件的专栏, 字段类型将是一个 MemoField。如果是的话,你就回家了。如果不是,请右键单击Fields editor,记下 WAV 数据字段名称,删除 WAV 数据列并右键单击以手动创建一个 TMemoField 并将其 FieldName 属性设置为您刚刚记下的名称。

然后您可以在刚刚创建的 MemoField 上使用SaveToFile

【讨论】:

  • 我已经尽可能彻底地查看了文档。我不知道如何从 fSQLite3Query 到“使用 TBlobfield 的 SaveToFile()”这个词“显然”在我身上丢失了。 :)
  • 没有问题 - 请参阅我刚刚发布的更新。
  • 我从这个答案中学到了很多东西。我不知道 FDQuery 是可以在 Delphi IDE 中编辑的可视化组件。我在代码中创建了 TFDQuery。我没有意识到我需要的关键代码行是:theBlobField := TBlobField(fSQLite3Query.FieldByName(kSQLFieldMultimediaFileContents));
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-14
  • 2018-04-20
  • 1970-01-01
  • 1970-01-01
  • 2020-02-11
相关资源
最近更新 更多