Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

duarte69

[Resolvido] Imagem --> VB<-->Access

Recommended Posts

Boas,

 

Estou a fazer um programa em VB 6 para inserir/ler dados numa Base de Dados Access e queria inserir/ler imagens através do VB para a BD.

 

Alguém sabe como se faz?

 

Cumps

 

edit: já agora, dá para contar o nº de campos de uma base de dados access através de VB? Pode-se fazer com o COUNT??

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiro crie a sua base de dados e no campo que voce quer guardar as imagens coloca como tipo de dado OBJECTO OLE.

Converter a base de dados em formato do Access 97

 

Depois de converter a base de dados, abra o Visual Basic.

Crie um form e coloque nele uma ImageBox, 3 CommandButton com os seguintes nomes "adicionar", "guardar", "buscar foto"

 

O exemplo que eu estou mostrando aqui é usando o DataControl.

 

entao adicione um DataControl no seu form.

 

Adicione tambem o controle CommonDialog, para adicionar é so dar um clique sobre a ToolBox com o botao direito e escolher a opcao componentes, depois selecione Microsoft CommonDialog e faça OK. assim ele aparecera na tua ToolBox, depois é so colocar ele no seu form. Continuando..

 

Na propriedade DataBaseName do DataControl coloque o caminho onde se encontra a tua base de dados

Na propriedade RecordSource coloque o nome da tabela

 

Agora na image coloca na propriedade DataSource o nome do DataControl que é como default Data1, ainda na image na propriedade DataField escolha o nome do campo que colocou no momento da criação da base de dados.

 

Agora vem o codigo:

 

Botao "adicionar"

 

Data1.Recordeset.Addnew

 

Botao "buscar foto"

 

CommonDialog1.showOpen

Image1.Picture=LoadPicture(CommonDialog1.showOpen)

 

Botao "guardar"

 

Data1.UpdateRecord

Data1.Refresh

 

Se voce nao usa o DataControl pra ligar as suas base de dados diz ai que eu lhe dou umas dicas, lhe garanto que é a maneira mais facil que existe pra connectar base de dados do Acess com o VB

 

Use o Datacontrol pra movimentar os registos.............Espero ter ajudado em alguma coisa http://forum.imasters.com.br/public/style_emoticons/default/grin.gif http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

Desculpa, voce quer saber se da pra contar os registos ou os campos????

Compartilhar este post


Link para o post
Compartilhar em outros sites

método dao

Tenta

Msgbox Seu_Recordset.Fields.Count

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boas,

 

Obrigado pela ajuda, é mais fácil do que eu estava a pensar.

 

Eu estou a usar o comando Adodc para ser compatível com a DB 03, os comandos são os mesmos?

 

Eu quero contar o número de registos com o mesmo código, qualquer coisa do género: SELECT * FROM Armazém WHERE cod_armazem=AA COUNT ref, penso que a SQL não é bem assim, mas dá para perceber.

 

Cumps

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, não querendo ser chato, mas acho que não vale a pena ele fazer via DAOm já que está aprendendo agora, pode fazer via ADO que nem sequer precisa converter o banco para 97, pode trabalhar com até XP ou 2003.

 

Tem um tópico que ensina, segue abaixo:

 

http://forum.imasters.com.br/index.php...;hl=imagens+sql

 

Usa a dica que o marcoaoteixeira deu que funciona direitinho.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boas, obrigado pela ajuda.

 

Segui o link e meti no meu programa, mas está a dar um erro.

 

Em:

 

Private Sub cmd_confirmar_Click()

Dim FSO As New FileSystemObject

 

 

Diz: Compile erro: user-difined type not difined

 

Alguém sabe dizer porque está a dar este erro?

 

Cumps

Compartilhar este post


Link para o post
Compartilhar em outros sites

isstring eu não conheço, mas isnumeric existe sim...

 

if isnumeric(variavel) then...

 

Mas acho que vendo se é um número, automaticamente se não for, é uma string né..

 

Vá em Project --> References e procure essa biblioteca que citei.

 

Depois me diga se conseguiu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boas, obrigado pela ajuda, esse problema ficou resolvido.

 

Agora está a dar outro, quando chega à parte de ligaçao.Recordset.Update dá erro e diz que a operação de múltiplos passos gerou erro.Verifique cada valor de estado. O que poderá ser???

 

Outra coisa, qual é o melhor sitio para colocar o código para fazer o upload da imagem para o vb??

 

 

Cumps

Compartilhar este post


Link para o post
Compartilhar em outros sites

Posta a parte do código que está dando erro, diga qual é a linha e o que está fazendo até chegar no erro.

 

 

O que quer dizer com sítio? Você quer saber qual objeto você usa para visualizar a imagem no seu programa? Use um image.

 

Posta a parte do código que está dando erro, diga qual é a linha e o que está fazendo até chegar no erro.

 

 

O que quer dizer com sítio? Você quer saber qual objeto você usa para visualizar a imagem no seu programa? Use um image.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boas, aqui está o código:

 

CODE
Private Sub cmd_confirmar_Click()

Dim FSO As New FileSystemObject

Dim strLOCAL As String

Dim bytARQUIVO() As Byte

 

'confirmar introdução do registo e verificar se todos os campos foram preenchidos

 

If nome = "" Then

MsgBox "Introduza o nome", vbExclamation, "Dados em falta"

nome.SetFocus

ElseIf bi = "" Then

MsgBox "Introduza o número do bilhete de identidade", vbExclamation, "Dados em falta"

bi.SetFocus

ElseIf datanas = "" Then

MsgBox "Introduza a data de nascimento", vbExclamation, "Dados em falta"

datanas.SetFocus

ElseIf password = "" Then

MsgBox "Gere uma PassWord", vbExclamation, "Dados em falta"

password.SetFocus

Else

'fazer o upload da imagem do trabalhador

 

Screen.MousePointer = vbHourglass

 

Erase bytARQUIVO()

 

ReDim bytARQUIVO(0)

 

strLOCAL = foto.Text

 

If FSO.FileExists(strLOCAL) Then 'Verifica se o arquivo existe no disco

 

Open strLOCAL For Binary As #1

 

ReDim bytARQUIVO(LOF(1))

 

Get #1, , bytARQUIVO()

 

Close #1

 

Else

 

Screen.MousePointer = vbDefault

 

Erase bytARQUIVO()

 

Exit Sub

 

End If

 

 

ligaçao.Recordset!foto = bytARQUIVO()

 

 

'Fim do upload da imagem

 

ligaçao.Recordset.Update

 

Screen.MousePointer = vbDefault

Erase bytARQUIVO()

 

eliminar.Enabled = True

cmdanterior.Enabled = True

cmdultimo.Enabled = True

cmdseguinte.Enabled = True

cmdprimeiro.Enabled = True

localizar.Enabled = True

End If

End Sub

 

A linha para onde é apontado o erro está a bold.

 

O que eu queria saber era qual o melhor objecto para meter a segunda parte do código, quando vou buscar a imagem à bd.

 

 

Cumps

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hum, aparentemente está correto essa parte.

 

Você está tentando adicionar essa imagem quando dá um addnew ou somente está atualizando uma entrada existente na tabela?

 

Use o objeto imagem mesmo...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boas,

 

Esse código é para adicionar um registo novo na bd. Na bd tenho o campo como Objecto OLE.

 

Uso uma Imagebox para ler as imagens da bd?

 

Cumps

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boas,

 

Esse código é para adicionar um registo novo na bd. Na bd tenho o campo como Objecto OLE.

 

Uso uma Imagebox para ler as imagens da bd?

 

Cumps

Se é para adicionar um novo, verifique se os outros campos que estão recebendo dados estão corretos, pois não parece que o erro vem na inserção da imagem. Confira se algum campo obrigatório está deixando de receber dado, se os tipos de dados pedidos correspondem aos dados passados, essas coisas...

 

Sim, use essa ferramenta para receber.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boas, já estou a conseguir introduzir a imagem na bd.

 

Mas ainda estou confuso quando ao inverso, eu tenho 5 botões que trabalham com a ligação à bd: "Primeiro", "Seguinte","Ultimo","Anterior" e "Procurar", tenho que meter a segunda parte do código em todos eles - ou fazer uma função e chamar em todos?

 

Cumps e obrigado pela ajuda

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, as duas opções que deu dará certo, mas o mais conveniente, em função de diminuir seu código é fazer uma sub e chamar no evento do botão mesmo...

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boas,

 

Já fiz isso e já trabalha, quase...

 

Tenho um problema que é o seguinte:

 

De uma maneira apenas consigo ver a imagem uma vez, por exemplo, vou andando de registo em registo, passo pelo que tem foto e vejo a foto, mas caso depois volte atrás já não vejo.

 

Esse código é o seguinte:

CODE

Dim byARQUIVO() As Byte

Dim sSQL As String

Dim strTEMP As String

 

On Error GoTo erro

 

byARQUIVO() = ligaçao.Recordset!foto

 

strTEMP = App.Path & "\Arq_TMP.tmp"

 

Open strTEMP For Binary As #1

 

Put #1, , byARQUIVO()

img_trabalhador.Picture = LoadPicture(strTEMP)

 

Close #1

Exit Sub

'caso não exita imagem do trabalhador

erro:

img_trabalhador.Picture = LoadPicture("sem_foto.bmp")

 

End Sub

 

 

De outra maneira consigo ver sempre a imagem, mas visto que nem todos os registo têm imagem dá erro quando chego a esses.

 

CODE
Private Sub recuperarimg()

'fazer o download da imagem da bd

 

Dim byARQUIVO() As Byte

Dim sSQL As String

Dim strTEMP As String

 

 

 

byARQUIVO() = ligaçao.Recordset!foto

 

strTEMP = App.Path & "\Arq_TMP.tmp"

 

Open strTEMP For Binary As #1

 

Put #1, , byARQUIVO()

 

On Error GoTo erro

img_trabalhador.Picture = LoadPicture(strTEMP)

 

Close #1

Exit Sub

'caso não exita imagem do trabalhador

erro:

img_trabalhador.Picture = LoadPicture("sem_foto.bmp")

 

End Sub

 

 

Como posso solucionar o problema?

 

 

E estou com outro problema também grave, sempre que insiro um registo com imagem a base de dados fica toda atrofiada, deixa de ordenar os campos pela chave primária (numérica e auto incremento), fica, por exemplo 1,2,3,4,10,5,6,7. A única forma de voltar ao normal é apagar o campo e voltar a inserir o campo, alterando o id de cada utilizador. Parece que os registos estão a ficar ordenados pela imagem, pois os que têm imagem ficam todos juntos.

 

 

Se alguém poder ajudar mais uma vez, agradecia.

 

Cumps

 

ps: já devem estar fartos de mim :rolleyes:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá mais uma vez...

 

Os campos que não tem imagem estão como? Null??

 

Se for, você pode fazer o seguinte para evitar o erro:

 

if not IsNull(ligaçao.Recordset!foto) then

 

'toda sua função para exibir

 

else

 

img_trabalhador.Picture = LoadPicture("sem_foto.bmp")

 

end if

 

Quanto à ordem que está aparecendo, está aparecendo quando você faz a consulta pelo programa ou quando abre sua tabela pelo access? Se for pela consulta pelo programa, basta indicar na query que quer que ordene por cod

Ex.: select * from minhatabela order by codigo

 

Vejo que está quase chegando lá, boa sorte...

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.