AJUDE POR FAVOR!!! BANCO DE DADOS COM IMAGEM

USUARIO.EXCLUIDOS 07/04/2007 09:51:02
#210665
Bom dia pessoal.

Estou precisando terminar um cadastro de imagens que estou fazendo, é o seguinte criei um arquivo .mdb com auxilio do visdata. A função do programinha que estou criando é cadastrar e consultar imagens. Porem estou tendo um problema.Na hora de cadastrar a imagem tudo ok!Porem na hora da consulta o tipico erro "Type mismatch" Número 13. Até entendi o problema, só não consegui resolver. E o problema é o seguinte, Coloquei como tipo de fields no Visdata "Memo", e quando eu mandava salvar as imagens ele salvava!!!Porem quando eu abria o banco de dados para ver como estava salvo estava cheio de números, ao inves de exibir a imagem. E na hora de fazer a consulta não era possivel, dava o tipico erro "Type mismatch", isso pelo fato de que não se exibi números em um image, e sim em um text, mas como salvar e consultar imagens então???

Obs:. Já tentei colocar os fields como binary ao inves de memo, mas não deu certo, da um outro erro que não me recordo agora.

Obrigado.
USUARIO.EXCLUIDOS 07/04/2007 10:46:25
#210683
Amigo,

Como sugestão faria um campo string com o nome do arquivo da imagem. Com isso na hora de ler, é so busca-la na pasta de imagems.


USUARIO.EXCLUIDOS 07/04/2007 11:16:26
#210688
Amigo, muito obrigado pela solução, porem preciso usar banco de dados, pois as imagens serão exibidas quando determinado código for digitado, mas de qualquer forma obrigado.

Eu só estou precisando saber como trato o tipo de informação de imagem para quando fizer o mecanismo de busca o sistema exibir as imagens do banco de dados.

Obrigado.
USUARIO.EXCLUIDOS 07/04/2007 17:43:00
#210699
Primeira coisa mude o tipo do campo para Objeto OLE, depois:

Suponhamos o seguinte:

TABELA:FotosCliente

CAMPOS:

CLIENTE NUMERO (INTEIRO LONGO)
FOTO OBJETO OLE

Use o seguinte:


Private Sub GravaFoto()

'INICIALIZA

Dim Qd As rdoQuery
Dim Rs As rdoResultset
Dim FileName As String
Dim DataFile As Integer, Fl As Long, Chunks As Integer
Dim Fragment As Integer, Chunk() As Byte, i As Integer
Dim sSql As String

sSql = ""
sSql = sSql & "SELECT "
sSql = sSql & " CLIENTE, "
sSql = sSql & " FOTO "
sSql = sSql & "FROM "
sSql = sSql & " FOTOSCLIENTE "
sSql = sSql & "WHERE "
sSql = sSql & " CLIENTE = " & txtCliente.Text

Set Qd = Banco.CreateQuery("FotosCliente", sSql)

'GRAVA FOTO

Set Rs = Qd.OpenResultset(rdOpenKeyset, _
rdConcurRowVer)
If Rs Is Nothing Or Rs.Updatable = False Then
ResetAmpulheta
Rs.Close
Set Qd = Nothing
MsgBox "Nao foi possivel gravar a foto do cliente!", vbCritical
Exit Sub
End If
If Rs.EOF Then
Rs.AddNew
Rs!Cliente = txtCliente.Text
Else
Rs.Edit
End If
DataFile = 1
Open FileName For Binary Access Read As DataFile
Fl = lOF(DataFile) ' Tamanho dos dados dentro do arquivo
If Fl = 0 Then Close DataFile: Exit Sub
Chunks = Fl ChunkSize
Fragment = Fl Mod ChunkSize
Rs!FOTO.AppendChunk Null
ReDim Chunk(Fragment)
Get DataFile, , Chunk()
Rs!FOTO.AppendChunk Chunk()
ReDim Chunk(ChunkSize)
For i = 1 To Chunks
Get DataFile, , Chunk()
Rs!FOTO.AppendChunk Chunk()
Next i
Close DataFile
Rs.Update
Rs.Close
Rem MsgBox "Foto gravada com sucesso!", vbExclamation
Set Qd = Nothing

end Sub




private sub CarregaFoto()

'INICIALIZA

Dim Qd As rdoQuery
Dim Rs As rdoResultset
Dim FileName As String
Dim DataFile As Integer, Fl As Long, Chunks As Integer
Dim Fragment As Integer, Chunk() As Byte, i As Integer
Dim sSql As String

Set Rs = Qd.OpenResultset(rdOpenKeyset, rdConcurRowVer)
If Rs Is Nothing Or Rs.Updatable = False Then
ResetAmpulheta
MsgBox "Nao foi possivel exibir a foto do cliente!", vbCritical
Rs.Close: Qd.Close
Set Qd = Nothing
Exit Sub
End If
If Rs.EOF Then
ResetAmpulheta
cmdLimparFoto_Click
Rem MsgBox "Nao existe nenhuma foto armazenada!", vbExclamation
Rs.Close: Qd.Close
Set Qd = Nothing
Exit Sub
End If
DataFile = 1
Kill App.Path & "\pictemp.tif" 'Deleta arquivo temporario de foto
Open App.Path & "\pictemp.tif" For Binary Access Write As DataFile
Fl = Rs!FOTO.ColumnSize
Chunks = Fl ChunkSize
Fragment = Fl Mod ChunkSize
ReDim Chunk(Fragment)
Chunk() = Rs!FOTO.GetChunk(Fragment)
Put DataFile, , Chunk()
For i = 1 To Chunks
ReDim Buffer(ChunkSize)
Chunk() = Rs!FOTO.GetChunk(ChunkSize)
Put DataFile, , Chunk()
Next i
Close DataFile
Rs.Close: Qd.Close
Set Qd = Nothing

FileName = App.Path & "\pictemp.tif"

If FileName = "" Then Exit Sub

Dim P As Single
Dim F As IPictureDisp

Set F = LoadPicture(FileName)

P = picFoto.Width / F.Width
If Int(F.Width * P) > picFoto.Width Then
P = picFoto.Height / F.Height
End If
If Int(F.Height * P) > picFoto.Height Then
P = picFoto.Height / F.Height
End If

picFoto.Cls
picFoto.PaintPicture F, 0, 0, F.Width * P, F.Height * P

end Sub



ESPERO TER AJUDADO

WEBER 08/04/2007 11:36:48
#210721
Cara vamos por partes
1-nao guarde a imagem no banco isso fara com que o seu banco cresca muito.
2-crie uma pasta padrao onde as imagens serao guardadas, pois se trabalhar em rede o C:\ nao funciona seria melhor ja definir um caminho na rede \\server\pasta imagens\, ou seja seria apenas gravado o caminho ate a imagem em um simples campo texto
3- para carregar a imagem basta

image.Picture = LoadPicture(caminho gravado no banco)

USUARIO.EXCLUIDOS 08/04/2007 14:06:32
#210732
Conforme disse nosso amigo IANELII
Citação:

Amigo, muito obrigado pela solução, porem preciso usar banco de dados, pois as imagens serão exibidas quando determinado código for digitado, mas de qualquer forma obrigado.

Gravar imagens em uma pasta não é seguro. Dados devem ser guardados em banco de dados... IANELLI vc deve saber qual a melhor
forma para o seu sistema. Cada caso...é um caso...

WEBER 08/04/2007 14:31:03
#210733
Citação:

FRAU escreveu:
Conforme disse nosso amigo IANELII Amigo, muito obrigado pela solução, porem preciso usar banco de dados, pois as imagens serão exibidas quando determinado código for digitado, mas de qualquer forma obrigado.

Gravar imagens em uma pasta não é seguro. Dados devem ser guardados em banco de dados... IANELLI vc deve saber qual a melhor
forma para o seu sistema. Cada caso...é um caso...


sim concordo q cada caso é um caso, mas nao me referi ao lado de segurança e sim apenas a performance do banco, mas enfim...
Tópico encerrado , respostas não são mais permitidas