Delphi - 将TStringStream保存为SQL

时间:2012-12-12 18:24:59

标签: mysql delphi delphi-xe2 stringstream

我正在使用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

提前致谢!

杰克

3 个答案:

答案 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)

问题解决了:

  1. 通过frxPDFExport导出,

  2. 将其流重写为TMemoryStream,

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

  4. 并将其作为'0x'+ converted_hex_string

  5. 插入sql

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

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

    你可以在网上查找将字节数组(TMemoryStream)转换为hexed字符串的函数。

    杰克。