如何在Delphi FireDAC SQLite中将blob保存到文件中



My Delphi 10.4.2项目将.WAV文件的内容存储在SQLite3数据库blob字段中,代码为:

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

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

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

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

MyBlobField.SaveToFile('c:tempsomewavfile.wav');

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

使用Sql查询打开FDQuery时,除非采取措施使FDQuery的行为有所不同,否则它将在Sql的结果集中为每列创建一个TField子代字段。FireDAC使用来自服务器的元数据来确定它为每个Sql列创建的TField子代(例如,TIntegerField、TStringField、TBlobField(。FDQuery将在您对FDQuery调用.Close((时立即释放字段。

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

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

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

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

最新更新