2

我正在使用 Embarcadero Delphi XE2

我正在创建一个快速报告(它不是那么重要)并将其保存到 TStringStream

接下来只是为了测试,我将该 TStringStream 输出到文件,并且 PDF 可以正常保存并正常打开。它的重量约为 40KB(更少)

接下来我需要做的是通过 INSERT 将此 PDF (TStringStream) 写入 SQL 数据库,我唯一要做的修改就是将所有 " 替换为 "" 因为它在 " 引号内,否则 SQL 不起作用。

奇怪的是,当我从数据库加载文件时,甚至加载到附件是之前保存的 PDF 数据的 SELECT 长度(附件)。当我这样做时,大小超过 50KB(对于某些 PDF 甚至大约 70KB),并且 PDF 是整个空白的。

我被迫为这个项目使用一个简单的 mysql 单元,它不允许一些 setParams 或通过我搜索的 Blob 对象保存它。所以我需要一个关于这个简单方法的答案。将 TStringStream 插入 SQL 数据库。

数据库字段类型为 MEDIUMBLOB

提前致谢!

杰克

4

3 回答 3

3

在数据库中定义一个 blob 字段,然后您可以使用 DataSet 组件的CreateBlobStream()方法获取一个TStream对象,您可以根据需要使用该对象读取和写入该 blob 字段。

您甚至可以TMemoryStream完全消除它,这取决于它在其余代码中的使用方式。例如,如果您只是为了将 PDFTMemoryStream存储在数据库中而将 PDF 保存到临时文件中,那么您可以摆脱并让TMemoryStreamFastReport 通过返回的 直接将 PDF 保存到 blob 字段。TStreamCreateBlobStream()

于 2012-12-13T08:18:24.823 回答
2

这取决于您使用的数据类型。正如 tvdien 所说,如果您还没有,请查看存储的 blob 字段。使用 blob 字段,加载到数据库并保存回内存流很容易。要加载到数据库,您可以这样做:

TBlobField(MyQuery.FieldByName('MyName')).LoadFromStream(MyMemoryStream)

SaveToStream并使用TBlobField 类中的从数据库复制回内存流。

于 2012-12-12T18:56:00.130 回答
0

问题通过以下方式解决:

  1. 通过 frxPDFExport 导出,

  2. 将其流覆盖到 TMemoryStream,

  3. 将 TMemoryStream 转换为十六进制字符串

  4. 并将其作为 '0x'+converted_hex_string 插入到 sql

无论如何感谢您的帮助,希望这个答案有助于解决类似的问题

重要:它必须是 TMemoryStream 因为 PDF 中有一些奇怪的 ASCII 字符,所以当我将它导出到 TStringStream 然后转换为十六进制时,它就损坏了。

您可以在网上查找将字节数组(TMemoryStream)转换为十六进制字符串的功能。

杰克。

于 2012-12-17T22:11:57.657 回答