/ / Delphi - Salvando TStringStream para SQL - mysql, delphi, delphi-xe2, stringstream

Delphi - Salvando TStringStream para SQL - mysql, delphi, delphi-xe2, stringstream

Estou usando o Embarcadero Delphi XE2

Eu estou criando um fastreport (não é tão importante) e salvá-lo em TStringStream

Em seguida, apenas para os testes eu saída que TStringStream para arquivo, eo PDF salva bem e abre bem. Ele pesa cerca de 40KB (menos)

O que eu preciso fazer agora é escrever este PDF(TStringStream) para banco de dados SQL através de INSERT, a única coisa que eu faço para modificá-lo é substituir todos os "com" "porque está dentro de" aspas, caso contrário, o SQL não funciona.

O estranho é que, quando eu carregar o arquivo debanco de dados, ou mesmo para SELECT comprimento (anexo), onde o anexo é dados PDF salvos anteriormente. Quando eu faço isso, o tamanho é maior que 50KB (para alguns PDFs até cerca de 70KB), e o PDF está todo em branco.

Eu sou forçado a usar uma simples unidade mysql para issoprojeto que não permite alguns setParams ou salvá-lo através do objeto Blob que eu pesquisei. Então, eu preciso de uma resposta sobre este método simples. Insira TStringStream ao banco de dados SQL.

O campo do banco de dados é do tipo MEDIUMBLOB

Desde já, obrigado!

Jack

Respostas:

3 para resposta № 1

Defina um campo blob no seu banco de dados, então você pode usar seu componente DataSet "s CreateBlobStream() método para obter um TStream objeto que você pode usar para ler e gravar no campo de blob conforme necessário.

Você pode até ser capaz de eliminar o TMemoryStream completamente, dependendo de como está sendo usado no resto do seu código. Por exemplo, se você está apenas salvando o PDF em um temp TMemoryStream com o único propósito de armazená-lo no banco de dados, então você pode se livrar do TMemoryStream e ter FastReport salvar o PDF diretamente para o campo de blob através do TStream aquele CreateBlobStream() retorna.


2 para resposta № 2

Isso depende do tipo de dados que você está usando. Como tvdien declarou, dê uma olhada nos campos blob para o seu armazenamento, se você não o tiver feito. Com um campo blob, é fácil carregar no banco de dados e salvar de volta em um fluxo de memória. Para carregar no banco de dados, faça isso:

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

e copiando do banco de dados de volta para o fluxo de memória usa o SaveToStream na classe TBlobField.


0 para resposta № 3

O problema foi resolvido por:

  1. Exportar através do frxPDFExport,

  2. substituir seu fluxo para TMemoryStream,

  3. Convertendo o TMemoryStream em String Hex

  4. e INSERTANDO-o para sql como "0x" + converted_hex_string

Obrigado pela ajuda de qualquer maneira, Espero que esta resposta ajude com problemas semelhantes

Importante: tinha que ser TMemoryStream por causa de alguns estranhos caracteres ASCII em PDF, então quando eu o exportei para TStringStream e depois convertei para hexadecimal, ele saiu corrompido.

Você pode procurar na rede a função para converter matriz de bytes (TMemoryStream) em string hexadecimal.

Jack.