如何将 blob 保存到 Delphi FireDAC SQLite 中的文件
How to save a blob to a file in Delphi FireDAC SQLite
我的 Delphi 10.4.2 项目使用以下代码将 .WAV 文件的内容存储在 SQLite3 数据库 blob 字段中:
fSQLite3Query: TFDQuery;
fSQLite3Query.ParamByName(kSQLFieldMultimediaFileContents).LoadFromFile(MultimediaFileName, ftBlob);
成功 SELECT * 查询后,使用什么代码将该字段的内容保存回文件?
您可以使用 TBlobField
的 SaveToFile
来执行此操作。显然,如果您在 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 并设置某些行为(如字段的显示格式)。要设置持久 TFields,您可以这样做:
- 在IDE中右击FDQuery,在弹出的
Fields editor...
中点击
- 然后,您将看到
Fields editor
弹出窗口。
- 右键单击它,然后从上下文菜单中 select
Add all fields
。
- 然后
Fields editor
将为 Sql 结果集中的每一列填充一个字段。 (此时您也可以根据需要手动添加计算字段和查找字段)。
完成所有这些后,您会发现字段显示在对象检查器中,每个字段都有一个基于 FDQuery 名称和 [=50 的相关列名称组合的组件名称=]查询。希望对于包含 .WAV 文件的专栏,
字段类型将是一个 MemoField。如果是,那你就回家了;如果不是,在Fields editor
中右击,记下WAV数据FieldName,删除WAV数据栏,右击手动创建一个TMemoField,并将其FieldName 属性设置为你的名字刚注意到。
然后您可以在刚创建的 MemoField 上使用 SaveToFile
。
我的 Delphi 10.4.2 项目使用以下代码将 .WAV 文件的内容存储在 SQLite3 数据库 blob 字段中:
fSQLite3Query: TFDQuery;
fSQLite3Query.ParamByName(kSQLFieldMultimediaFileContents).LoadFromFile(MultimediaFileName, ftBlob);
成功 SELECT * 查询后,使用什么代码将该字段的内容保存回文件?
您可以使用 TBlobField
的 SaveToFile
来执行此操作。显然,如果您在 Delphi IDE.
见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 并设置某些行为(如字段的显示格式)。要设置持久 TFields,您可以这样做:
- 在IDE中右击FDQuery,在弹出的
Fields editor...
中点击 - 然后,您将看到
Fields editor
弹出窗口。 - 右键单击它,然后从上下文菜单中 select
Add all fields
。 - 然后
Fields editor
将为 Sql 结果集中的每一列填充一个字段。 (此时您也可以根据需要手动添加计算字段和查找字段)。
完成所有这些后,您会发现字段显示在对象检查器中,每个字段都有一个基于 FDQuery 名称和 [=50 的相关列名称组合的组件名称=]查询。希望对于包含 .WAV 文件的专栏,
字段类型将是一个 MemoField。如果是,那你就回家了;如果不是,在Fields editor
中右击,记下WAV数据FieldName,删除WAV数据栏,右击手动创建一个TMemoField,并将其FieldName 属性设置为你的名字刚注意到。
然后您可以在刚创建的 MemoField 上使用 SaveToFile
。