Jump to content
Sign in to follow this  
progster

Inserir imagens em BD

Recommended Posts

progster

Boas.

Tenho andado a trabalhar no seguinte código para poder inserir imagens numa aplicação que estou a desenvolver.

O objectivo é: Numa BD Access com 50 funcionários, conforme se passa de registo para registo aparecer a fotografia do respectivo funcionário.

 
  Try
            'Dim FotografiasPictureBox As String
            OpenFileDialog1.ShowDialog()
            txtNomeFuncionario.Text = OpenFileDialog1.FileName
            txtNomeFuncionario.Text = OpenFileDialog1.SafeFileName
            FotografiasPictureBox = Image.FromFile(FotografiasPictureBox.Image)
        Catch ex As Exception
            MessageBox.Show("Não selecionou nenhuma imagem!")
        End Try
        FuncionáriosTableAdapter.Update(Dsbd1.Funcionários)

E está-me a dar erro no parametro da seguinte linha:

 
FotografiasPictureBox = Image.FromFile(FotografiasPictureBox.Image)

O erro é:

Value of type 'System.Drawing.Image' cannot be converted to 'String'.

Alguém me pode ajudar?

Desde já fico agradecido.

Cumprimentos.


Não resolvo dúvidas por PM.

Share this post


Link to post
Share on other sites
bioshock

Isso faz rigorosamente: nada.

Estás a guardar as imagens na base de dados ou numa pasta?

Share this post


Link to post
Share on other sites
progster

Também já tinha pensado em as guardar na BD, mas iria ficar com um tamanho grande, logo decidi colocar as imagens numa pasta á parte.


Não resolvo dúvidas por PM.

Share this post


Link to post
Share on other sites
bioshock

Se as imagens estão numa página, isso seria antes assim:

PictureBox1.Image = Image.FromFile("C:\ImagesAll\Alfredo.Png")

Share this post


Link to post
Share on other sites
progster

Estou a testar com outro bloco de código:


        Dim OFD As New OpenFileDialog
        OFD.Multiselect = False
        OFD.Title = "Abrir imagem..."
        OFD.Filter = "Imagens|*.JPG; *.TIFF; *BMP;*PNG; *TIFF"
        OFD.ShowDialog()
        cmdInserirfoto.Enabled = True
        FotografiasPictureBox.Image = New Bitmap(OFD.FileName)
        FuncionáriosTableAdapter.Update(Dsbd1.Funcionários)

E obtive resultados, deste modo já vai a buscar as fotografias, o problema é quando vou para guardar o registo na BD, dá-me o seguinte erro:

Unable to cast object of type 'System.Drawing.Bitmap' to type 'System.IConvertible'.Couldn't store <System.Drawing.Bitmap> in Fotografias Column.  Expected type is Byte.

Não sei se é relevante, mas na BD tenho o campo fotografias definido como byte.


Não resolvo dúvidas por PM.

Share this post


Link to post
Share on other sites
bioshock

Estás a fazer uma grande confusão.

Tu afinal queres apanhar o nome da foto que está na BD e atirá-la para a Picturebox, ou queres carregar uma imagem para base de dados?

Share this post


Link to post
Share on other sites
progster

Sim, muito provavelmente já estou a trocar as voltas a tudo.

Estou a zero com este tipo de assunto. Especiamente em vb.

Quando estava a começar a dar os primeiros passos com o access, consegui fazer isto, mas tinha um problema de cada vez que inseria uma imagem, o tamanho da BD ia aumentando. Ou seja, uma BD com um tamanho de 4 MB, passava rapidamente para os 15 MB, e por ai fora.

Como estou a experimentar novamente, inserir imagens numa BD, lembrei-me deste ponto.

De qualquer maneira, parece-me que o ideal é atirar a imagem para a picturebox.


Não resolvo dúvidas por PM.

Share this post


Link to post
Share on other sites
bioshock

Faz o seguinte, guarda apenas o nome da foto na BD, o campo da BD será String.

Feito isto, quando carregas os dados, tudo o que tens é de direccionar a Picturebox.Image para o caminho das Fotos + o Nome que consta na BD.

Imaginando que tu tens uma pasta chamada "Fotos" na pasta bin\debug, terias algo do género:

Dim nomeFoto As String ' Esta variável recebe os valores da base de dados:
Picturebox1.Image = Image.FromFile(Application.StartupPath & "\Fotos\" & nomeFoto)

Share this post


Link to post
Share on other sites
progster

Na BD Access, tenho os campos: Nr_Funcionário, Nome Funcionário, Fotografias.

Defini para o campo Fotografias o tipo de dados texto, e só lá coloquei o nome da fotografia.jpg

No vb actualizei o dataset.

Coloquei as linhas de código no botão Inserir foto:

Dim Fotografias As String ' Esta variável recebe os valores da base de dados:
        FotografiasPictureBox.Image = Image.FromFile(Application.StartupPath & "\Fotos\" & Fotografias)
        Dim OFD As New OpenFileDialog
        OFD.Multiselect = False
        OFD.Title = "Abrir imagem..."
        OFD.Filter = "Imagens|*.JPG; *.TIFF; *BMP;*PNG; *TIFF"
        OFD.ShowDialog()
        cmdInserirfoto.Enabled = True
        FotografiasPictureBox.Image = New Bitmap(OFD.FileName)
        FuncionáriosTableAdapter.Update(Dsbd1.Funcionários)

Quando ia correr a aplicação deu erro desta vez no load do form.

O erro é: Input string was not in a correct format.Couldn't store <Adelia Bernardo.jpg> in Fotografias Column.  Expected type is Byte.


Não resolvo dúvidas por PM.

Share this post


Link to post
Share on other sites
Caça

Tens a certeza que actualizaste o DataSet?


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
bioshock

O que estás a fazer está completamente errado.

Para que é que estás a criar um OpenFileDialog() se o valor vem da base de dados e não da escolha do utilizador? Não faz sentido sequer.

Exemplo:

Dim ConnectionString As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Application.StartupPath & "\BD.mdb")
Dim query As String = "SELECT Foto FROM Clientes WHERE ID = @IDCliente"

Dim command As New OleDbCommand(query, ConnectionString)
command.Parameters.Add("@IDCliente", OleDbType.Integer).Value = 3 

Dim DataAdapter As New OleDbDataAdapter(command)
Dim MyData As New DataSet 
DataAdapter.Fill(MyData, "Clientes")

Picturebox1.Image = Image.FromFile(Application.StartupPath & "\Fotos\" & MyData.Tables(0).Rows(0).Item(0).ToString)

http://wiki.portugal-a-programar.org/dev_net:vb.net:access

Share this post


Link to post
Share on other sites
progster

Dim ConnectionString As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Application.StartupPath & "\bd1.mdb")
Dim query As String = "SELECT Fotografias FROM Funcionários WHERE Nome Funcionário = @Nome Funcionário"

        Dim command As New OleDbCommand(query, ConnectionString)
        command.Parameters.Add("@Nome Funcionário", OleDbType.Integer).Value = 3

        Dim DataAdapter As New OleDbDataAdapter(command)
        Dim MyData As New DataSet
        DataAdapter.Fill(MyData, "Funcionários")

        FotografiasPictureBox.Image = Image.FromFile(Application.StartupPath & "\Fotos\" & MyData.Tables(0).Rows(0).Item(0).ToString)

Agora está a dar erro na penultima linha:

Erro de sintaxe (operador em falta) na expressão de consulta 'Nome Funcionário = @Nome Funcionário'.


Não resolvo dúvidas por PM.

Share this post


Link to post
Share on other sites
bioshock

Algumas das regras básicas de campos das bases de dados:

1. Jamais utilizar espaços;

2. Evitar acentos;

3. Não colocar caracteres especiais;

4. Colocar algo sucinto e perceptível.

Agora pensa e depois volta cá :happybday:

Share this post


Link to post
Share on other sites
progster

Já funciona. Obrigado a todos pela ajuda.

Cumprimentos.


Não resolvo dúvidas por PM.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.