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 № 1Defina 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:
Exportar através do frxPDFExport,
substituir seu fluxo para TMemoryStream,
Convertendo o TMemoryStream em String Hex
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.