SALVAR E RECUPERAR EM CAMPOS BLOB - MYSQL E FIREBI

TRTNCG 21/01/2011 16:15:35
#362985
Olá Galera, Boa Tarde!

Bem gostaria de saber se alguém já trabalhou ou trabalha com fotos salvas diretamente em um campo da tabela do tipo BLOB em MySQL ou Firebird. Como salver e como recuperar. Já que sei que o banco vai ficar bem maior dependo da quantidade de registros, mas fica mais profissional sem ter que salvar so o Path da foto em um campo da tabela.
XXXANGELSXXX 21/01/2011 19:08:51
#363017
Resposta escolhida
Thiago, voce tem que tomar alguns cuidados quando se fala salvar path de imagem, primeira situaçao : se voce grava la o path por exemplo C:\FOTOS\IMAGEM.JPG, vai que amanha ou depois voce formata a maquina, reinstala seu sistema e depois de reinstalado vc coloca as fotos em outro diretorio?? ai começa a complicar, ou senao como uma maquina da rede vai ler essa pasta c:\fotos ? sempre que a pasta vai estar no servidor.. e nao local??? olha o que eu fiz para contornar isso, coloquei em um arquivo INI o caminho onde as fotos estao : ex : \\server\fotos\ , entao ele busca esse path para iniciar e depois eu pego a respectiva imagem, ex : \\server\fotos\foto.jpg, ai em qualquer maquina voce pode acessar normalmente.. ok??? e se formatar depois a maquina.. mesmo trocando o nome da maquina.. e so vc ir no arquivo ini e modificar o caminho de inicializacao.. tipo.. \\servidor\fotos.. mais ou menos entendeu ? outra alternativa e realmente gravar os dados no bdados.. faço assim.. :
 
Private Sub CmDGrava_Click()
On Error GoTo ErrorLine
Conecta True
Set RsImagem = New ADODB.Recordset
Set mystream = New ADODB.Stream
mystream.Type = adTypeBinary
Sql = [Ô]SELECT id,catlogo,catlogopresente FROM cadcat where id=[ô][Ô] & TDBGrid1.TextMatrix(TDBGrid1.Row, 0) & [Ô][ô][Ô]
RsImagem.Open Sql, Conexao, adOpenStatic, adLockOptimistic
mystream.Open
mystream.LoadFromFile StrImagem
RsImagem!ID = TDBGrid1.TextMatrix(TDBGrid1.Row, 0)
RsImagem!catlogopresente = [Ô]1[Ô]
RsImagem!catlogo = mystream.Read
RsImagem.Update
mystream.Close
RsImagem.Close
Set RsImagem = Nothing
CmDGrava.Visible = False
btnImgAdd.Visible = True
Conecta False
Exit Sub
ErrorLine:
If Err = -2147217887 Then
msg1.MsgBox [Ô] Imagem muito grande para ser arquivada![Ô] & _
Chr(13) & [Ô] Selecione outra imagem ou redefina a mesma![Ô], vbExclamation, [Ô]Aviso[Ô]
Img.Picture = Picture1.Picture
Call btnImgAdd_Click
Else
MsgError
End If
End Sub



e para recuperar a imagem.
  
Private Sub PegarImagem()
On Error GoTo ErrorLine
Set RsImagem = New ADODB.Recordset
Dim mystream As New ADODB.Stream
With mystream
.Type = adTypeBinary
cSql = [Ô]SELECT catlogo FROM cadcat where id=[ô][Ô] & TDBGrid1.TextMatrix(TDBGrid1.Row, 0) & [Ô][ô][Ô]
RsImagem.Open cSql, Conexao, adOpenStatic, adLockReadOnly
.Open
.Write RsImagem!catlogo
.SaveToFile App.Path & [Ô]    mp.bmp[Ô], adSaveCreateOverWrite
.Close
Img.Picture = LoadPicture(App.Path & [Ô]    mp.bmp[Ô])
Kill (App.Path & [Ô]    mp.bmp[Ô])
RsImagem.Close
Set RsImagem = Nothing
End With
Exit Sub
ErrorLine:
If Err.Number = 481 Then
Img.Picture = Picture1.Picture
Else
MsgError
End If
End Sub




Espero que isso te ajude
DANLEONHART 22/01/2011 23:27:08
#363126
Amigo, dá para postar mais detalhes ?
o que é a variavel [Ô]StrImagem[Ô]...
antes de Setar a [Ô]mystream[Ô] tem de primeiro declarar (tipo: Dim mystream as New ADODB.Stream), certo ?!

gostei do script, quero entende-lo agora
ADRIANOM 22/01/2011 23:39:52
#363127
Meu parceiro...
Acho que é isto que procuras...
http://www.vbmania.com.br/pages/index.php?varModulo=Detalhe&varID=8273
ADRIANOM 24/01/2011 17:06:47
#363291
Serviu?
XXXANGELSXXX 24/01/2011 18:07:27
#363297
isso danleonhart, strimagem é uma string,
Dim StrImagem As String

Que recebe o valor da commondialog
  
Sub btnImgAdd_Click()
On Error Resume Next
btnImgAdd.Visible = False
CmDGrava.Visible = True

With cmdAnexo
.InitDir = App.Path & [Ô]\Imagens[Ô]
.Filter = [Ô]Todas as Imagens| *.bmp;*.jpg;*.gif;*.wmf;*.emf[Ô]

.CancelError = True
.ShowOpen
Img.Picture = LoadPicture(.FileName)
StrImagem = [Ô][Ô] & cmdAnexo.FileName
CmDGrava.Visible = True
btnImgAdd.Visible = False

End With
End Sub

Tópico encerrado , respostas não são mais permitidas