erro ao Salvar imagem na tabela
Pessoal quero gravar uma imagem na tabela entao fasso o seguinte:
- Firebir 1.5, delphi 7
- Campo da tabela: ´IMAGEM BLOB SUB_TYPE 0 SEGMENT SIZE 240´
o erro que é retornado é o seguinte: ´Internal Error´
- mesmo dando esse a imagem é salva na tabela, porem nao é exibido o ´ShowMessage´
- Ja tentei com o componente TImage e TDBImage... com ambos gera o mesmo erro.
Obs: baixei um componente sugerido por um colega do forum. ´eDBImage´, porem nao consegui instala-lo, entao preferia que fosse com os componentes nativos do delphi...
se alguem puder me ajudar...
Abraços!
- Firebir 1.5, delphi 7
- Campo da tabela: ´IMAGEM BLOB SUB_TYPE 0 SEGMENT SIZE 240´
Dm.Tbl_Corretor.insert; Dm.Tbl_CorretorImagem.LoadFromFile(OpenPictureDialog1.FileName); Dm.Tbl_Corretor.post; Dm.Tbl_Corretor.applyupdates; showMessage(´imagem gravada com sucesso´);
o erro que é retornado é o seguinte: ´Internal Error´
- mesmo dando esse a imagem é salva na tabela, porem nao é exibido o ´ShowMessage´
- Ja tentei com o componente TImage e TDBImage... com ambos gera o mesmo erro.
Obs: baixei um componente sugerido por um colega do forum. ´eDBImage´, porem nao consegui instala-lo, entao preferia que fosse com os componentes nativos do delphi...
se alguem puder me ajudar...
Abraços!
Mahdak
Curtidas 0
Respostas
Mahdak
10/02/2006
pessoal, estou fazendo assim pra gravar a imagemem jpg:
- porem ainda continuo tendo o o erro: ´Internal error´ ...
Obs: mesmo com esse erro a imagem é salva na tabela....
Alguem ja passou por isso? alguem poderia me dar uma mão?
Abraços!
uses ..... jpeg,Clipbrd; . . . . . . var jpg:TJpegImage; begin if OpenPictureDialog1.Execute then begin jpg := TJpegImage.Create; jpg.LoadFromFile(OpenPictureDialog1.FileName); clipboard.Assign(jpg); DBImage1.PasteFromClipboard; jpg.Free; end; end;
- porem ainda continuo tendo o o erro: ´Internal error´ ...
Obs: mesmo com esse erro a imagem é salva na tabela....
Alguem ja passou por isso? alguem poderia me dar uma mão?
Abraços!
GOSTEI 0
Mahdak
10/02/2006
se eu remover essas duas linhas nao acontece o erro:
Dm.Tbl_Corretor.post;
Dm.Tbl_Corretor.applyupdates;
porem nao salva....
e agora..... :cry:
Dm.Tbl_Corretor.post;
Dm.Tbl_Corretor.applyupdates;
porem nao salva....
e agora..... :cry:
GOSTEI 0
Martins
10/02/2006
Vamos tentar assim:
Espero q funcione para o q vc deseja!
Dm.Tbl_Corretor.Append; Dm.Tbl_CorretorImagem.Assign(OpenPictureDialog1.FileName); Dm.Tbl_Corretor.post; Dm.Tbl_Corretor.applyupdates; showMessage(´imagem gravada com sucesso´);
Espero q funcione para o q vc deseja!
GOSTEI 0
Martins
10/02/2006
Corrigindo o post anterior.
Boa Sorte!!!
var Img: TJpegImage; BStream : TBlobStream; begin Dm.Tbl_Corretor.Append; BStream := TBlobStream.Create((Imagem as BlobField), BMWrite); Img := TJpegImage.Create; Img.LoadFromFile(OpenPictureDialog.FileName); Img.SaveToStream(BStream); BStrteam.Free; Img.Free; Dm.Tbl_Corretor.post; Dm.Tbl_Corretor.applyupdates; showMessage(´imagem gravada com sucesso´); end;
Boa Sorte!!!
GOSTEI 0
Mahdak
10/02/2006
erro:
-----
[Error] U_Corretor.pas(431): Incompatible types: ´TPersistent´ and ´TFileName´
-----
[Error] U_Corretor.pas(431): Incompatible types: ´TPersistent´ and ´TFileName´
GOSTEI 0
Mahdak
10/02/2006
erro:
-----
[Error] U_Corretor.pas(431): Incompatible types: ´TPersistent´ and ´TFileName´
opa, desculpa nao tinha visto a correção do código, mas o delphi gerou o seguinte erro:
[Error] U_Corretor.pas(374): Undeclared identifier: ´TBlobStream´
Será que tem que eclarar algo em USES???
GOSTEI 0
Mahdak
10/02/2006
uses
DBTables
DBTables
GOSTEI 0
Mahdak
10/02/2006
só mais uma pergunta...
BStream := TBlobStream.Create((Imagem as TBlobField), BMWrite);
´Imagem´ é um campo certo?? que campo é esse???
BStream := TBlobStream.Create((Imagem as TBlobField), BMWrite);
´Imagem´ é um campo certo?? que campo é esse???
GOSTEI 0
Mahdak
10/02/2006
ok fiz assim:
- Deu erro de Acess Violation at adress.....
var Img:TJpegImage; BStream : TBlobStream; Imagem:TBlobField; Dm.Tbl_Corretor.Append; BStream := TBlobStream.Create((Imagem as TBlobField), BMWrite); Img := TJpegImage.Create; Img.LoadFromFile(OpenPictureDialog1.FileName); Img.SaveToStream(BStream); BStream.Free; Img.Free;
- Deu erro de Acess Violation at adress.....
GOSTEI 0
Emerson Nascimento
10/02/2006
[i:75ad7c0d9a]Imagem[/i:75ad7c0d9a] é o próprio campo!
var Img:TJpegImage; BStream : TBlobStream; begin Dm.Tbl_Corretor.Append; BStream := TBlobStream.Create((Dm.Tbl_CorretorImagem as TBlobField), BMWrite); Img := TJpegImage.Create; Img.LoadFromFile(OpenPictureDialog1.FileName); Img.SaveToStream(BStream); BStream.Free; Img.Free; Dm.Tbl_Corretor.Post; end;
GOSTEI 0
Martins
10/02/2006
[i:f6926dc169]Imagem[/i:f6926dc169] é o próprio campo!
var Img:TJpegImage; BStream : TBlobStream; begin Dm.Tbl_Corretor.Append; BStream := TBlobStream.Create((Dm.Tbl_CorretorImagem as TBlobField), BMWrite); Img := TJpegImage.Create; Img.LoadFromFile(OpenPictureDialog1.FileName); Img.SaveToStream(BStream); BStream.Free; Img.Free; Dm.Tbl_Corretor.Post; end;
Valew pela contribuição [b:f6926dc169]Emerson.en[/b:f6926dc169]!
GOSTEI 0
Mahdak
10/02/2006
emerson, muito obrigado ela contribuição.... nao queria parecer chato, mas eh que fiz tudo certinho como vc disse e dessa vez o erro foi o seguinte:
´Invalid Class Typecast.´
o que poderia ser isso?
´Invalid Class Typecast.´
o que poderia ser isso?
GOSTEI 0
Mahdak
10/02/2006
sobe
GOSTEI 0
Martins
10/02/2006
[b:86487f664a]Vejamos esse código q eu passei para o FabianoNovo[/b:86487f664a]
Estou usando TImage no lugar de TDBImage
procedure TFrmFabianovo.LoadFotoBanco(Arquivo: String); Var stImagem: TFileStream; begin stImagem := TFileStream.Create( Arquivo, fmOpenRead or fmShareDenyWrite ); Try ibdsClienteFOTO.LoadFromStream( stImagem ); Finally stImagem.Free; End; end; procedure TFrmFabianovo.GetImgBanco(var foto: TImage); Var jpgImg: TJPEGImage; stMem: TMemoryStream; begin If ibdsClienteFOTO.IsNull Then Exit; jpgImg := TJPEGImage.Create; stMem := TMemoryStream.Create; Try ibdsClienteFOTO.SaveToStream( stMem ); stMem.Position := 0; jpgImg.LoadFromStream( stMem ); foto.Picture.Assign( jpgImg ); Finally stMem.Free; jpgImg.Free; End; end;
Estou usando TImage no lugar de TDBImage
GOSTEI 0
Mahdak
10/02/2006
Martins, onde está a referencia ao caminho da imagem ´OpenPictureDialog1.FileName´??
fiz desse jeito e ele gerou um erro: ´JPG error #42´
Abraços!
fiz desse jeito e ele gerou um erro: ´JPG error #42´
Abraços!
GOSTEI 0
Martins
10/02/2006
Martins, onde está a referencia ao caminho da imagem ´OpenPictureDialog1.FileName´??
fiz desse jeito e ele gerou um erro: ´JPG error #42´
Abraços!
proceure TForm1.BtnFotoClick(Sender: TObject); begin OpendDialog1.Execute; LoadFotoBanco(OpenDialog1.FileName); GetImgBanco(Image1); end;
Qual o seu Banco de Dados?
vc deseja exibir a imagem dentro de um TDBImage?
Boa sorte!!!
[/code]
GOSTEI 0
Mahdak
10/02/2006
Qual o seu Banco de Dados?
vc deseja exibir a imagem dentro de um TDBImage?
Boa sorte!!!
- Meu banco é Firebird 1.5
- campo da tabela := BLOB SUB_TYPE 0 SEGMENT SIZE 80,
- Nao precisa ser necessáriamente dentro de um TDBImage. eu conseguindo que a imagem seja salva certinho e conseguindo visualiza-la depois pode ser até dentro de um BitBtn ehehehehee... eu to meio apavorado aqui com isso... vou dar uma olhada no que vc acabou de postar...
Valleu, e abração!
GOSTEI 0
Emerson Nascimento
10/02/2006
quais os componentes de acesso?
GOSTEI 0
Mahdak
10/02/2006
quais os componentes de acesso?
Componentes de acesso:
------------------------------
- TIBDataBase
- TIBTransaction
- TIBDataSet
- DataSource
Componentes do formulario:
---------------------------------
- TDBImage ou TImage (atualmente uso TDBImage)
- TOpenPictureDialog (ja vi exemplos que usavam TOpenDialog, mas acho que nao seria o caso neh?)
Emerson, se voce puder me dar uma mão com isso....
Abração!
GOSTEI 0
Emerson Nascimento
10/02/2006
eu fiz assim:
[b:5bddd721fe]procedimento para gravar a imagem:[/b:5bddd721fe]
[b:5bddd721fe]procedimento para ler a imagem:[/b:5bddd721fe]
coloquei, no evento AfterScroll:
e, no botão para gravação da imagem:
[color=blue:5bddd721fe][size=18:5bddd721fe][b:5bddd721fe]além disso, alterei, no IBDataset, as propriedades[/b:5bddd721fe][/size:5bddd721fe][/color:5bddd721fe]
DeleteSQL,
ModifySQL,
RefreshSQL
de modo a ter somente os campos-chave no where (tirei o campo imagem do where)
[b:5bddd721fe]procedimento para gravar a imagem:[/b:5bddd721fe]
procedure Grava_Imagem_JPEG(Campo:TBlobField; Foto:TImage; Dialogo: TOpenPictureDialog); var Img: TJpegImage; begin if not (Campo.DataSet.State in [dsEdit, dsInsert]) then begin if Campo.DataSet.IsEmpty then Campo.DataSet.Append else Campo.DataSet.Edit; end; if Campo.DataSet.State = dsInsert then Campo.DataSet.FieldByName(´codigo´).AsInteger := GetTickCount; Img := TJpegImage.Create; Img.LoadFromFile(Dialogo.FileName); TBlobField(Campo.DataSet.FieldByName(´imagem´)).Assign( Img ); Foto.Picture.Assign( Img ); Img.Free; end;
[b:5bddd721fe]procedimento para ler a imagem:[/b:5bddd721fe]
procedure Le_Imagem_JPEG(Campo:TBlobField; Foto:TImage); var MS: TMemoryStream; MinhaImagem: TJPEGImage; begin if Campo.AsString <> ´´ Then begin MS := TMemoryStream.Create; Campo.SaveToStream(MS); MinhaImagem := TJPEGImage.Create; MinhaImagem.Assign( Campo ); Foto.Picture.Assign( MinhaImagem ); MS.Free; MinhaImagem.Free; end end;
coloquei, no evento AfterScroll:
try if DataSet.Active then Le_Imagem_JPEG(TBlobField(DataSource1.DataSet.FieldByName(´imagem´)),Image1); except end;
e, no botão para gravação da imagem:
if OpenPictureDialog1.Execute then Grava_Imagem_JPEG(TBlobField(IBDataset1.fieldByName(´Imagem´)),Image1,OpenPictureDialog1);
[color=blue:5bddd721fe][size=18:5bddd721fe][b:5bddd721fe]além disso, alterei, no IBDataset, as propriedades[/b:5bddd721fe][/size:5bddd721fe][/color:5bddd721fe]
DeleteSQL,
ModifySQL,
RefreshSQL
de modo a ter somente os campos-chave no where (tirei o campo imagem do where)
GOSTEI 0
Helio Nascimento
10/02/2006
Caro Emerson
- Caro Amigo Emerson, neste exemplo daria para inserir um arquivo *.doc ?
É que precisaria gravar algumas ´matrizes´ no Word para depois recupera-la e substituir trechos - São pequenos ´Impressos´ e Contratos efetuados no Word, e gostaria de salvá-los num campo tipo Blob (imagem ou texto?) e depois recuperá-los para serem regravados com outro nome após as alterações. utilizo o Firebird 1.5x Conecção com o DBExpress e com o D7.
Sds/Hélio
eu fiz assim: procedimento para gravar a imagem: Código: procedure Grava_Imagem_JPEG(Campo:TBlobField; Foto:TImage; Dialogo: TOpenPictureDialog); var Img: TJpegImage; begin if not (Campo.DataSet.State in [dsEdit, dsInsert]) then begin if Campo.DataSet.IsEmpty then Campo.DataSet.Append else Campo.DataSet.Edit; end; if Campo.DataSet.State = dsInsert then Campo.DataSet.FieldByName(´codigo´).AsInteger := GetTickCount; Img := TJpegImage.Create; Img.LoadFromFile(Dialogo.FileName); TBlobField(Campo.DataSet.FieldByName(´imagem´)).Assign( Img ); Foto.Picture.Assign( Img ); Img.Free; end; procedimento para ler a imagem: Código: procedure Le_Imagem_JPEG(Campo:TBlobField; Foto:TImage); var MS: TMemoryStream; MinhaImagem: TJPEGImage; begin if Campo.AsString <> ´´ Then begin MS := TMemoryStream.Create; Campo.SaveToStream(MS); MinhaImagem := TJPEGImage.Create; MinhaImagem.Assign( Campo ); Foto.Picture.Assign( MinhaImagem ); MS.Free; MinhaImagem.Free; end end; coloquei, no evento AfterScroll: Código: try if DataSet.Active then Le_Imagem_JPEG(TBlobField(DataSource1.DataSet.FieldByName(´imagem´)),Image1); except end; e, no botão para gravação da imagem: Código: if OpenPictureDialog1.Execute then Grava_Imagem_JPEG(TBlobField(IBDataset1.fieldByName(´Imagem´)),Image1,OpenPictureDialog1); além disso, alterei, no IBDataset, as propriedades DeleteSQL, ModifySQL, RefreshSQL de modo a ter somente os campos-chave no where (tirei o campo imagem do where) _________________ Sem "saber" que era impossível, ele foi lá e fez...
- Caro Amigo Emerson, neste exemplo daria para inserir um arquivo *.doc ?
É que precisaria gravar algumas ´matrizes´ no Word para depois recupera-la e substituir trechos - São pequenos ´Impressos´ e Contratos efetuados no Word, e gostaria de salvá-los num campo tipo Blob (imagem ou texto?) e depois recuperá-los para serem regravados com outro nome após as alterações. utilizo o Firebird 1.5x Conecção com o DBExpress e com o D7.
Sds/Hélio
GOSTEI 0
Emerson Nascimento
10/02/2006
sim, é possível, mas não com esse exemplo, pois foi desenvolvido para arquivos JPG.
primeiro: seu campo deve ser BLOB SUB_TYPE 0 SEGMENT SIZE 80 (procure mais sobre os campos BLOB do FB na internet), que é um campo tipo binário (SUB_TYPE 0).
depois, creio que basta vc fazer:
para gravar na tabela:
TBlobField( SeuCampo ).LoadFromFile( SeuArquivo.doc );
para recuperar da tabela:
TBlobField( SeuCampo ).SaveToFile( AlgumArquivo.doc );
primeiro: seu campo deve ser BLOB SUB_TYPE 0 SEGMENT SIZE 80 (procure mais sobre os campos BLOB do FB na internet), que é um campo tipo binário (SUB_TYPE 0).
depois, creio que basta vc fazer:
para gravar na tabela:
TBlobField( SeuCampo ).LoadFromFile( SeuArquivo.doc );
para recuperar da tabela:
TBlobField( SeuCampo ).SaveToFile( AlgumArquivo.doc );
GOSTEI 0