Como salvar PDF ou images no Banco de Dados?

26/02/2024

0

Não sei se estou perguntando no lugar certo. Comecei na plataforma hoje. Minha situação é a seguinte:

Estou utilizando o Delphi XE7 e o Firebird 2.5. Criei um banco de dados com uma tabela "REGISTRO". Preciso que nesta tabela, salve de alguma maneira um pdf ou imagem de um documento. Salvar o caminho não é viável para mim, pois alguém pode move-lo ou deleta-lo no processo.

Até agora fiz o código para incluir os outros dados da tabela mas não sei se com o pdf irá funcionar da mesma maneira. O código é o seguinte:

procedure TformRegistro.IncluirClick(Sender: TObject);
begin
DM.FDRegistro.Open;
DM.FDRegistro.Append;
DM.FDRegistro.FieldByName('codigo').AsInteger := 0;
end;

procedure TformRegistro.SalvarClick(Sender: TObject);
var cod: integer;
begin
cod := strtoint(DBCodigo.Caption);
if cod <> 0 then
begin
DM.FDRegistro.Post;
end
else
begin
DM.FDRegistro.Post;
with DM.FDRegistro, SQL do
begin
Close;
Clear;
Add('select max(codigo)as codigo from registro');
Open;
end;
DM.FDRegistro.Open;
DM.FDRegistro.Locate('codigo',DM.FDPesquisa.FieldByName('codigo').AsInteger,[loCaseInsensitive]);
end;
end;

* Comecei recentemente na linguagem, então gostaria de pedir paciência e se possível dar uma ajuda de maneira clara. Obrigada
Maria Elisa

Maria Elisa

Responder

Post mais votado

26/02/2024

Bancos de dados relacionais podem conter milhões de linhas em determinadas tabelas. Utilizar componentes arrastados para a tela, que abrem a tabela para carga dos registros, não é uma boa prática, já que isso pode consumir memória e ler dados não necessários do banco. Com o passar do tempo, com múltiplos usuários acessando simultaneamente, isso começa a consumir recursos demais do banco e pode levar a um problema de performance.

Para armazenar um arquivo binário em um banco de dados, é necessário criar uma coluna do tipo BLOB (Binary Large Object). Em colunas deste tipo, o banco armazena um conjunto de bytes, mas não tem informações sobre seu conteúdo. Portanto, informações como nome do arquivo, tamanho e tipo (extensão) precisam ser armazenados na tabela, para uma futura extração, se necessário.

Em condições normais, quando inserimos dados em uma tabela, o ideal é utilizar um componente do tipo Query e utilizar um comando "insert into tabela values (...)". Porém, isso nem sempre funciona diretamente com registros do tipo BLOB. Geralmente, faço o insert do registro com valor NULL na coluna BLOB e, depois, executo um update. Neste momento, utilizo um stream para fornecer ao banco os bytes a serem inseridos.

Mas, existem vários exemplos disponíveis na internet.

Veja este exemplo simplificado:

FDQuery1.SQL.Text := 'INSERT INTO tab (blobdata) VALUES (:blobdata)';
FDQuery1.Params[0].DataType := ftBlob;
// FireDAC takes ownership of the stream object
FDQuery1.Params[0].AsStream := TFileStream.Create('data.bin', fmOpenRead);
FDQuery1.ExecSQL;


Ele fará o insert de uma linha na tabela "tab", inserindo o conteúdo do arquivo "data.bin" na coluna "blobdata".

No seu exemplo, serão inseridas outras colunas, mas a ideia é a mesma.

Arthur Heinrich

Arthur Heinrich
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar