Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Delphi-将TStringStream保存到SQL_Mysql_Delphi_Delphi Xe2_Stringstream - Fatal编程技术网

Mysql Delphi-将TStringStream保存到SQL

Mysql Delphi-将TStringStream保存到SQL,mysql,delphi,delphi-xe2,stringstream,Mysql,Delphi,Delphi Xe2,Stringstream,我使用的是Embarcadero Delphi XE2 我正在创建一个fastreport(没有那么重要)并将其保存到TStringStream 接下来,为了测试,我将TStringStream输出到文件中,PDF保存良好,打开良好。它的重量约为40KB(更少) 接下来我需要做的是,通过INSERT将这个PDF(TStringStream)写入SQL数据库,我要做的唯一修改就是用“”替换所有,因为它的内引号,否则SQL将无法工作 奇怪的是,当我从数据库加载文件时,甚至选择长度(附件),其中附件是

我使用的是Embarcadero Delphi XE2

我正在创建一个fastreport(没有那么重要)并将其保存到TStringStream

接下来,为了测试,我将TStringStream输出到文件中,PDF保存良好,打开良好。它的重量约为40KB(更少)

接下来我需要做的是,通过INSERT将这个PDF(TStringStream)写入SQL数据库,我要做的唯一修改就是用“”替换所有,因为它的内引号,否则SQL将无法工作

奇怪的是,当我从数据库加载文件时,甚至选择长度(附件),其中附件是先前保存的PDF数据。当我这样做的时候,它的大小超过了50KB(对于一些PDF甚至是70KB),而PDF是完全空白的

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

数据库字段的类型为MEDIUMBLOB

提前谢谢


Jack

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

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


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

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


您甚至可以完全消除
TMemoryStream
,这取决于它在其余代码中的使用方式。例如,如果您只是将PDF保存到临时
TMemoryStream
以将其存储在数据库中,那么您可以去掉
TMemoryStream
,让FastReport通过
TStream
CreateBlobStream()将PDF直接保存到blob字段
返回。

问题通过以下方式解决:

  • 通过frxPDFExport进行出口

  • 将其流重写为TMemoryStream

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

  • 并将其作为“0x”+转换的十六进制字符串插入sql

  • 无论如何,谢谢你的帮助, 希望这个答案对类似的问题有所帮助

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

    你可以在网上查询,那里有一个将字节数组(TMemoryStream)转换为已被hexed字符串的函数


    Jack.

    了解一下BLOB数据类型。如果您的字段类型是字符串(无论出于何种原因,您都无法更改),那么可能可以选择另存为base64编码。fieldtype是MEDIUMBLOB,但无论出于何种原因,当我将其插入数据库时,数据会增长25%,当我将其从数据库PDF(数据)中保存回来时,数据会增长25%是否已损坏为什么要在字符串流中存储二进制文件?如果您想将其存储为(可打印)字符串,最好遵循@Computer advice并将其转换为base64!!与其直接访问
    TblobStream
    ,不如改用数据集的
    CreateBlobStream()
    方法,然后根据需要从返回的
    TStream
    读取/写入数据。@Remy Lebeau-CreateBlobStream方法如何比重铸字段并从内存流加载更好?从文档中我可以看到,创建的blob流比重铸更易波动,必须为每个记录上的每个blob重新创建。
    CreateBlobStream()
    是首选方法。它允许数据集通过使用优化的
    TStream
    实现来决定如何最好地访问字段数据。如果查看DB.pas中
    TBlobField
    的实现,它在内部使用
    CreateBlobStream()
    。但是,通过像您一样直接使用
    TBlobField
    ,您的代码必须知道
    TBlobField
    是什么,以及一个字段是否是
    TBlobField
    ,这样类型转换就不会失败,而如果您直接调用
    CreateBlobStream()
    ,则不必担心这一点根据使用方式的不同,您可以直接删除
    TMemoryStream
    。如果您只是将某些内容保存到临时
    TMemoryStream
    ,然后将其加载到blob字段中,则可以删除
    TMemoryStream
    ,直接将数据保存到blob字段中。不同的实现可获得相同的结果,但是其中一个是抽象的和可扩展的,而另一个依赖于特定的实现细节,这不是编写代码的好方法。我正在做的项目使用了一个简单的mysql库,我所能做的就是写一个插入。。。值(stringStream.DataStream)问题是当我从那里读到一个损坏的PDF时,在php中我会添加斜杠(stringStream.DataStream),但在这里我不知道应该添加哪些字符escape@Prozi-您使用的是什么mysql库?标题注释为:Borland Delphi的mysql客户端API(版本4及以上)libmySQL.dll的Pascal接口单元,MySQL AB的SQL数据库服务器的客户端库这是MySQL AB的C头文件、MySQL.h、MySQL_com.h和MySQL_版本的相关部分的直译。h@Prozi你的专栏是一个大杂烩吗?库是否使用支持参数?您最好编辑您的问题以添加重要信息,因为您忽略了这一点,人们认为您使用的是数据集子体,这是首选方法。使用参数化SQL查询是一个不错的选择,是的。您可以在中使用