Insert de Campo BLOB (foto) Via SQL - Erro
Estou inserindo um campo BLOB em uma tabela Firebird, mas via SQL
DBExpress, Delphi7
mas está dando erro, a foto fica em um campo Timage (Variável TPicture)
padrão JPG.
Mas está dando erro
dm.SQL_FOTO.Close;
dm.CDT_FOTO.Active:=false;
dm.SQL_FOTO.CommandText:=´INSERT INTO FOTOS_PRO (CODBARRA, FOTO) VALUES (:VCODBAR, :VIMAGEM)´;
dm.SQL_FOTO.ParamByName(´vcodbar´).AsString:=dbedit35.Text;
dm.SQL_FOTO.ParamByName(´VIMAGEM´).asBlobd:=image1.Picture;
dm.SQL_FOTO.Open;
dm.cdt_foto.Active:=true;
DBExpress, Delphi7
mas está dando erro, a foto fica em um campo Timage (Variável TPicture)
padrão JPG.
Mas está dando erro
dm.SQL_FOTO.Close;
dm.CDT_FOTO.Active:=false;
dm.SQL_FOTO.CommandText:=´INSERT INTO FOTOS_PRO (CODBARRA, FOTO) VALUES (:VCODBAR, :VIMAGEM)´;
dm.SQL_FOTO.ParamByName(´vcodbar´).AsString:=dbedit35.Text;
dm.SQL_FOTO.ParamByName(´VIMAGEM´).asBlobd:=image1.Picture;
dm.SQL_FOTO.Open;
dm.cdt_foto.Active:=true;
Nilson Junior
Curtidas 0
Respostas
Afarias
16/10/2003
carrege a imagem do TImage para um Stream e então, carregue-a para seu parâmetro usando o método LoadFromStream, seria algo como::
var
Stm: TStream;
begin
{...}
Stm := TMemoryStream.Create;
Image1.Picture.Bitmap.SaveToStream(Stm); // ou .Graphic.Save...
Stm.Position := 0;
dm.SQL_FOTO.ParamByName(´VIMAGEM´).LoadFromStream(Stm);
{...}
end;
nunca fiz, mas é por ai... sempre carrego meu Stream direto do arquivo.
T+
var
Stm: TStream;
begin
{...}
Stm := TMemoryStream.Create;
Image1.Picture.Bitmap.SaveToStream(Stm); // ou .Graphic.Save...
Stm.Position := 0;
dm.SQL_FOTO.ParamByName(´VIMAGEM´).LoadFromStream(Stm);
{...}
end;
nunca fiz, mas é por ai... sempre carrego meu Stream direto do arquivo.
T+
GOSTEI 0
Nilson Junior
16/10/2003
:lol:
Valeu deu certo....
Brigado e T+
Nilson
Valeu deu certo....
Brigado e T+
Nilson
GOSTEI 0
Afarias
16/10/2003
Legal q deu certo,
Só uma coisinha... se não for sua prática usual, eu não mencionei que o código deve estar em um bloco TRY...FINALLY -- pois o objeto Stm (TStream) tem de ser destruído, OK?!
Stm := TMemoryStream.Create;
try
{ o código aqui }
finally
Stm.Free;
end;
T+
Só uma coisinha... se não for sua prática usual, eu não mencionei que o código deve estar em um bloco TRY...FINALLY -- pois o objeto Stm (TStream) tem de ser destruído, OK?!
Stm := TMemoryStream.Create;
try
{ o código aqui }
finally
Stm.Free;
end;
T+
GOSTEI 0
Nilson Junior
16/10/2003
Uma coisinha que falta
como passar o parâmetro de imagem JPG
coloquei no USES
com imagem BMP fica assim e da certo
vi := TMemoryStream.Create;
Image1.Picture.Bitmap.SaveToStream(vi);
mas com imagem JPG não da erro para compilar, mas nao grava, mas nao da erro
Agradeço antecipadamente
como passar o parâmetro de imagem JPG
coloquei no USES
com imagem BMP fica assim e da certo
vi := TMemoryStream.Create;
Image1.Picture.Bitmap.SaveToStream(vi);
mas com imagem JPG não da erro para compilar, mas nao grava, mas nao da erro
Agradeço antecipadamente
GOSTEI 0
Afarias
16/10/2003
adicione a unit JPEG na cláusula USES e use a classe TJpegImage, e a propriedade Picture.Graphic (TGraphic) do TImage -- ex::
procedure TForm1.GravarImagemJPGdoTImageEmCampoBlob;
var
Stm: TStream;
begin
Stm := TMemoryStream.Create;
try
(Image1.Picture.Graphic as TJpegImage).SaveToStream(Stm);
Stm.Position := 0;
with IBSQL1 do // ou IBQuery1
try
SQL.Text := ´INSERT INTO TABELA (CODIGO, IMAGEM) VALUES (:CODIGO, :IMAGEM)´;
Transaction.StartTransaction;
ParamByName(´CODIGO´).AsInteger := 1; // um ´código´
ParamByName(´IMAGEM´).LoadFromStream(Stm);
ExecQuery;
finally
Transaction.Commit;
end;
finally
Stm.Free;
end;
end;
e para carregar de volta -- tem várias formas -- uma delas::
procedure TForm1.RecuperarImagemJPGdoBancoParaTImage;
var
Stm: TStream;
Jpg: TJpegImage;
begin
Stm := TMemoryStream.Create;
Jpg := TJPEGImage.Create;
try
with IBSQL1 do
try
SQL.Text := ´SELECT IMAGEM FROM TABELA WHERE CODIGO = 1´;
Transaction.StartTransaction;
ExecQuery;
FieldByName(´IMAGEM´).SaveToStream(Stm);
Stm.Position := 0;
Jpg.LoadFromStream(Stm);
Image1.Picture.Assign(Jpg);
finally
Transaction.Commit;
end;
finally
Stm.Free;
Jpg.Free;
end;
end;
T+
procedure TForm1.GravarImagemJPGdoTImageEmCampoBlob;
var
Stm: TStream;
begin
Stm := TMemoryStream.Create;
try
(Image1.Picture.Graphic as TJpegImage).SaveToStream(Stm);
Stm.Position := 0;
with IBSQL1 do // ou IBQuery1
try
SQL.Text := ´INSERT INTO TABELA (CODIGO, IMAGEM) VALUES (:CODIGO, :IMAGEM)´;
Transaction.StartTransaction;
ParamByName(´CODIGO´).AsInteger := 1; // um ´código´
ParamByName(´IMAGEM´).LoadFromStream(Stm);
ExecQuery;
finally
Transaction.Commit;
end;
finally
Stm.Free;
end;
end;
e para carregar de volta -- tem várias formas -- uma delas::
procedure TForm1.RecuperarImagemJPGdoBancoParaTImage;
var
Stm: TStream;
Jpg: TJpegImage;
begin
Stm := TMemoryStream.Create;
Jpg := TJPEGImage.Create;
try
with IBSQL1 do
try
SQL.Text := ´SELECT IMAGEM FROM TABELA WHERE CODIGO = 1´;
Transaction.StartTransaction;
ExecQuery;
FieldByName(´IMAGEM´).SaveToStream(Stm);
Stm.Position := 0;
Jpg.LoadFromStream(Stm);
Image1.Picture.Assign(Jpg);
finally
Transaction.Commit;
end;
finally
Stm.Free;
Jpg.Free;
end;
end;
T+
GOSTEI 0