我正在使用Embarcadero Delphi XE2
我正在创建一个fastreport(它并不重要)并将其保存到TStringStream
接下来仅针对测试我将TStringStream输出到文件,并且PDF保存正常并打开正常。它的重量约为40KB(小)
我接下来需要做的是,通过INSERT将这个PDF(TStringStream)写入SQL数据库,我唯一要修改它的是我将所有“with”替换为“因为它在”引号内,否则SQL不会工作。
奇怪的是,当我从数据库加载文件时,甚至是SELECT长度(附件),其中附件是先前保存的PDF数据。当我这样做时,大小超过50KB(对于某些PDF甚至大约70KB),PDF全是空白。
我被迫为这个项目使用一个简单的mysql单元,它不允许一些setParams或通过我用Google搜索的Blob对象保存它。所以我需要一个关于这个简单方法的答案。将TStringStream插入SQL数据库。
数据库字段的类型为MEDIUMBLOB
提前致谢!
杰克
答案 0 :(得分:3)
在数据库中定义blob字段,然后您可以使用DataSet组件的CreateBlobStream()
方法获取TStream
对象,您可以根据需要使用该对象读取和写入blob字段
您甚至可以完全消除TMemoryStream
,具体取决于您在其余代码中的使用方式。例如,如果您只是将PDF保存到临时TMemoryStream
只是为了将其存储在数据库中,那么您可以删除TMemoryStream
并让FastReport将PDF直接保存到通过TStream
返回的CreateBlobStream()
blob字段。
答案 1 :(得分:2)
这取决于您使用的数据类型。正如tvdien所说,如果您还没有,请查看blob字段。使用blob字段,加载到数据库并保存回内存流很容易。要加载到数据库,您可以这样做:
TBlobField(MyQuery.FieldByName('MyName')).LoadFromStream(MyMemoryStream)
并从数据库复制回内存流使用TBlobField类中的SaveToStream
。
答案 2 :(得分:0)
问题解决了:
通过frxPDFExport导出,
将其流重写为TMemoryStream,
将TMemoryStream转换为十六进制字符串
并将其作为'0x'+ converted_hex_string
无论如何,谢谢你的帮助, 希望这个答案有助于解决类似的问题
重要的: 它必须是TMemoryStream,因为PDF中有一些奇怪的ASCII字符,所以当我将它导出到TStringStream然后转换为十六进制时,它就会出现损坏。
你可以在网上查找将字节数组(TMemoryStream)转换为hexed字符串的函数。
杰克。