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
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
Curtir tópico
+ 0
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:
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.
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
Responder
Clique aqui para fazer login e interagir na Comunidade :)