News & Events
Update de foto direto no banco
- 20 de fevereiro de 2009
- Posted by: Adriano Santos
- Category: Tutoriais
Difficulty level not set for this Post
Olá pessoal,
Tenho andado bastante atarefado, então está bem difícil fazer atualizações constantes do blog.
Essa semana tive problemas de atualização dos meus campos BLOB no Firebird 2.0.4 com RAD Studio 2007, então tive que ir atrás de uma solução. Acontecia um erro ao tentar dar um ApplyUpdates. Tentei de tudo, até mudança de driver, mas acabei fazendo no braço a atualização.
Criei um SQLConnection e uma variável TParams em runtime, para efetuar um UPDATE direto no banco usando o método Execute do SQLConnection. Vejam o restultado abaixo. Eu envio diretamente a foto, no meu caso, para o banco de dados. Só não coloquei transação por que não foi necessário.
O código não é novidade, mas confesso que encontrei a solução em poucos lugares e com poucos colegas. Vejam:
procedure TForm1.ButtonClick(Sender: TObject);
var
SQLCon : TSQLConnection;
vParam : TParams;
begin
SQLCon := TSQLConnection.Create(Self);
SQLCon.Params.Clear;
with SQLCon, Params do
begin
Add('DriverName=TBODBXFB');
Add('DriverUnit=TBODbxDynalink');
Add('DriverPackageLoader=TTBODbxDriverLoader,
TboDbxNative.bpl');
Add('DriverAssemblyLoader=
TBODbxFbManaged.TTBODbxDriverLoader,
TboDbxManaged');
Add('MetaDataPackageLoader=
TDBXFirebirdMetaDataCommandFactory,
TboDbxNative.bpl');
Add('MetaDataAssemblyLoader=
DBXFirebirdReadOnlyMetaData.
TDBXFirebirdMetaDataCommandFactory,
TboDbxManaged');
Add('BlobSize=-1');
Add('CommitRetain=False');
Add('Database=127.0.0.1/3052:
C:\Database\Sigem-Itanhaem.fdb');
Add('ErrorResourceFile=');
Add('LocaleCode=0000');
Add('Password=masterkey');
Add('RoleName=RoleName');
Add('ServerCharSet=');
Add('SQLDialect=3');
Add('Interbase TransIsolation=ReadCommited');
Add('User_Name=sysdba');
Add('WaitOnLocks=True');
Add('Trim Char=False');
ConnectionName := 'TesteTDBO';
DriverName := 'TBODBXFB';
KeepConnection := True;
LibraryName := 'tbodbxfb.dll';
LoadParamsOnConnect := False;
LoginPrompt := False;
VendorLib := 'fbclient.dll';
end;
SQLCon.Connected := True;
vParam := TParams.Create(SQLCon);
try
vParam.CreateParam(ftMemo,
'BLB_FOTO_CIDADAO',ptInput).LoadFromFile(pathstring, ftMemo);
vParam.CreateParam(ftInteger,'ID_FUNCIONARIO'
, ptInput);
vParam.ParamByName('ID_FUNCIONARIO'
).AsInteger :=
Funcionario.Objects.FieldByName(
'ID_FUNCIONARIO').AsInteger;
SQLCon.Execute('UPDATE FUNCIONARIO SET
BLB_FOTO_CIDADAO = :BLB_FOTO_CIDADAO WHERE
ID_FUNCIONARIO = :ID_FUNCIONARIO', vParam);
finally
vParam.Free;
SQLCon.Connected := False;
SQLCon.Free;
end;
end;
end;
Adriano Santos
Parabéns, sua inscrição no Feed RSS foi aceita. Leia em primeira mão todas as notícias do blog.
Siga @tdevrocks no Twitter agora e fique por dentro de todas as atualizações do blog.
Siga também o autor @asrsantos
Author: Adriano Santos
Adriano Santos é especialista em linguagens de desenvolvimento, Embarcadero MVP, possui +1000 artigos e vídeo-aulas publicadas em revistas e websites especializados, ex-editor chefe das revistas ClubeDelphi e WebMobile. Atualmente Diretor de Operações na startup GET IT! Technology e Consultor Senior na Embarcadero do Brasil.
Outra medida simples e bastante eficaz é guardar campos blob em uma tabela separada, relacionada (1..1 ou 1..N) à tabela original. Para atualizar o campo blob, remove-se o registro antigo e insere-se um novo.
Eu geralmente utilizo o código abaixo (ou parecido) para gravar imagens e outros tipos de dados em campos blobs no firebird com clientdataset:
if JvOpenDialog.Execute then
begin
jpeg := TJpegImage.Create;
Stream := TMemoryStream.Create;
try
jpeg.LoadFromFile(JvOpenDialog.FileName);
Image1.Picture.Graphic := jpeg;
Image1.Visible := true;
Image1.Picture.Graphic.SaveToStream(Stream);
Stream.Seek(0,0);
if not (Dm.Produtos.State in dsEditModes) then
Dm.Produtos.Edit;
Dm.ProdutosFOTO.LoadFromStream(Stream);
finally
Stream.Free;
jPeg.Free;
end;
end;
Anderson