Série da semana: Primeiros passos no React

Veja mais

Problemas ao tentar passar um parametro tipo Blob para uma Stored procedure

05/03/2016

3

Ambiente: SO - Windows 8.1
Versão Delphi - Embarcadero XE
Banco - FireBird 2.0

Estou tentando passar os parâmetros para uma Stored Procedure que tem os seguintes Parametros

Codigo - Inteiro
Foto - Blob

Segue a baixo a descrição dos campos

DM_FOTOS.SPIBTab_GravaFoto = É uma Stored Procedure que grava o registro na tabela onde o campo Fotografia é do tipo Blob,

DM_Fotos.IBTab_GravaFoto = É uma tabela que contém os valores que eu quero passar para o parâmetro da Stored Procedure.

Obs. Isto funcionava a muito tempo no delphi 7.

Abaixo estou passando a linha onde eu passo um campo para o parâmetro. (Onde está meu problema)

DM_FOTOS.SPIBTab_GravaFoto.ParamByName'VB_FOTOGRAFIA').AsBlob :=DM_Fotos.IBTab_GravaFoto.FieldByName('Fotografia').AsVariant;

O Problema é que apesar de nao dar erro de compilação ao passar por esta linha ele me da o seguinte erro

Class EvariantInvalidError With Message Invalid Argument

Ou seja ele não está aceitando passar um valor variant para um campo Blob.

Alguem poderia me ajudar pois eu sempre usei desta forma no Delphi 7 e anteriores porem agora no delphi xe não está, existe algum outro tipo que posso utilizar no campo da tabela ou existe alguma outra maneira de passar este valor para o parâmetro da procedure.

Já tentei loadfromfile mas também não deu certo.

Já tentei da forma abaixo.

DM_FOTOS.SPIBTab_GravaFoto.ParamByName'VB_FOTOGRAFIA').AsBlob := DM_Fotos.IBTab_GravaFoto.FieldByName('Fotografia').Value;

Desta forma até funciona porém ele grava algo invalido no banco pois depois deste comando toda vez que o sistema entra neste registro ele retorna a mensagem abaixo.

Class ERadError whith message 'Stream read error

DM_FOTOS.SPIBTab_GravaFoto.ParamByName'VB_FOTOGRAFIA').AsBlob := DM_Fotos.IBTab_GravaFoto.FieldByName('Fotografia').AsBlob;

Desta forma o componente StoredProc que estou utilizando não me retorna um campo com este valor, só tem value ou variant.
Responder

Posts

07/03/2016

Paulo Freire

procedure TFormPrincipal.GravaVisitante;
var
ImageJPG: TJPEGImage;
ImageMST: TMemoryStream;

begin


ImageJPG := TJPEGImage.Create;
ImageMST := TMemoryStream.Create;
ImageJPG.Assign(imgFotoCapturada.Picture.Graphic);
ImageJPG.SaveToStream(ImageMST);
ImageMST.Position := 0;

try

DM.SP_INS_UDP_VISITANTES.ParamByName('ID').AsInteger := StrtoInt(txtCod.Txt);
DM.SP_INS_UDP_VISITANTES.ParamByName('NOME').AsString := txtNome.Text;
DM.SP_INS_UDP_VISITANTES.ParamByName('EMPRESA').AsString := txtEmpresa.Text;
DM.SP_INS_UDP_VISITANTES.ParamByName('FOTO').LoadFromStream(ImageMST , ftBlob);
DM.SP_INS_UDP_VISITANTES.ExecProc;


finally

//Deu tudo Certo e Grava
Application.MessageBox('Colaborador(a) Registrado com sucesso !!!','Salvar',
MB_ICONINFORMATION + mb_OK);

//Imprime Etiqueta Zebra com Foto e local onde vai.
if MessageBox(Handle, 'Deseja imprimir Etiqueta?', 'Etique de Visitante', MB_YESNO+MB_SYSTEMMODAL+MB_ICONQUESTION+MB_DEFBUTTON1) = ID_YES Then
begin
ImprimeETQ;
end;


ImageJPG.Free;
ImageMST.Free;

end;

LimpaDados;
Responder