sqlite - Delphi - 如何将位图保存到 SQLite 数据库中的 BLOB 字段

标签 sqlite delphi bitmap blob firemonkey

我正在尝试将 TBitmap 图像数组添加到 ClientDataSet 的不同记录(在 ftBlob 字段中),然后将这些记录保存到 SQLite 数据库。 BLOB 字段(DocImage)是数据库中的必填字段。

但是,我的代码似乎根本没有将位图保存到 ClientDataSet 中的 blob 字段...因此,当我调用 BdmMain.cdsTrxDoc.ApplyUpdates(0) 时,我收到错误:“字段‘DocImage’必须有一个值。”

我在调用 FTrxPhotoValue[i].SaveToStream(BlobStream) 之前和之后检查了 BlobStream (BlobStream.Size) 的大小,它的大小确实增加了,但 BlobField 的数据大小仍为 0。

这是代码片段:

FTrxIDValue: Integer;
FTrxDocIDValue: array of Integer;
FTrxPhotoValue: array of TBitmap;
// ...
for i := 0 to Length(FTrxPhotoValue) do
begin
  BdmMain.cdsTrxDoc.Insert;
  BdmMain.cdsTrxDoc['TrxID'] := FTrxIDValue;
  BdmMain.cdsTrxDoc['DocID'] := FTrxDocIDValue[i];
  BlobField := BdmMain.cdsTrxDoc.FieldByName('DocImage');
  BlobStream := BdmMain.cdsTrxDoc.CreateBlobStream(BlobField, bmWrite);
  FTrxPhotoValue[i].SaveToStream(BlobStream);
end;
// ...
BdmMain.cdsTrxDoc.ApplyUpdates(0);

最佳答案

您应该在调用 SaveToStream释放流。该流仅在 Destroy 期间更新底层字段。

关于sqlite - Delphi - 如何将位图保存到 SQLite 数据库中的 BLOB 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46099167/

相关文章:

delphi - 如何阻止Delphi 11 "Close All"关闭IDE欢迎屏幕

delphi - 为什么在明显的 "safe"代码中使用异常处理?

forms - 如何检测WindowState的变化?

database - 如何在 Adob​​e Air 中的 LIKE 运算符模式中使用命名参数

ios - 如何在 Objective C 中处理数据库中的特殊字符?

java - SQLite 连接列表

C# bitblt位图渲染控件

c++ - 在 C++ 中将彩色位图转换为灰度

android - Android BigPictureStyle 推送通知中的图像/位图大小应该是多少?

database - SQLite3 数据库表中的只读字段?