none
Foto / Imagem do "cliente" no form de Cadastro

    Question

  • Pessoal preciso da "ajuda dos universitários"

    1) a idéia é permitir incluir fotos no cadastro.

    VS-2005 base dados Access

    Tenho algumas duvidas básicas, é melhor gravar o local da imagem, e armazenar as imagem em uma pasta separada do MDB, ou armazenar as imagens dentro do banco de dados usando um campo do tipo objeto-OLE ?

    claro que depois vão vir as outras duvidas, dependendo do posicionamento de vocês ?

     

     

    Wednesday, January 24, 2007 3:24 PM

Answers

  •  

    Eduardo uso a rotina abaixo para gravar fotos no meu banco ACCESS, no banco tenho um StoreProcedure(uma consulta atualização)

     

    Veja  a consulta em SQL

    PARAMETERS codigo Long, imagem LongBinary;
    UPDATE tblpr SET tblpr.FOTO = [imagem]
    WHERE (((tblpr.ID)=[codigo]));

     

    Code Snippet

    #Region "Rotinas Imagem"

    Private Function GravarImagem(ByVal codigoCliente As Integer) As Boolean

    'Define variaveis para gravar a imagem

    cn.Close()

    cn.Open()

    Dim SalvaImagem As Boolean = False

    Dim nomeArquivo As String = ""

    Try

    'buscamos a imagem a ser gravada

    Dim openDlg As OpenFileDialog = New OpenFileDialog

    openDlg.Filter = "(Jpeg Files) *.jpg | *.jpg"

    Dim filter As String = openDlg.Filter

    openDlg.Title = "Selecione um arquivo JPG para inserir no campo Foto"

    'abre a janela de diáglogo para procurar o arquivo a ser usado como imagem

    If (openDlg.ShowDialog() = Windows.Forms.DialogResult.OK) Then

    nomeArquivo = openDlg.FileName

    SalvaImagem = True

    Else

    Return False

    Exit Function

    End If

    'se uma imagem foi selecionada então inicia a gravação

    If SalvaImagem = True Then

    'Carrega a foto

    Dim fsFoto As FileStream

    fsFoto = New FileStream(nomeArquivo, FileMode.Open)

    Dim fiFoto As FileInfo = New FileInfo(nomeArquivo)

    Dim Temp As Long = fiFoto.Length

    Dim lung As Long = Convert.ToInt32(Temp)

    Dim picture(lung) As Byte

    'le a imagem

    fsFoto.Read(picture, 0, lung)

    fsFoto.Close()

    'cria um novo objeto command usando a stored procedure ja criada na base de dados

    Dim cmdFoto As New OleDbCommand("spFotoPr", cn)

    cmdFoto.CommandType = CommandType.StoredProcedure

    'recebe os parametros para a stored procedure spCarregaFoto

    Dim sql_codigoCliente = New OleDbParameter("CODIGO", codigoCliente)

    Dim sql_Foto As New OleDbParameter("IMAGEM", OleDbType.LongVarBinary)

    sql_Foto.Value = picture

    'adicona os parametros informados

    cmdFoto.Parameters.Add(sql_codigoCliente)

    cmdFoto.Parameters.Add(sql_Foto)

    'executa a stored procedures usando os parâmetros informados

    cmdFoto.ExecuteNonQuery()

    cmdFoto.Dispose()

    sql_Foto = Nothing

    picture = Nothing

    Return True

    Exit Function

    End If

    Catch ex As Exception

    MessageBox.Show(ex.Message)

    Return False

    End Try

    cn.Close()

    End Function

     

    Private Sub CarregarImagem(ByVal codCliente As Integer)

    Try

    'Carregar a foto

    cn.Open()

    Dim cmdFoto As New OleDb.OleDbCommand("select FOTO from tblpr where id = " & codCliente)

    cmdFoto.Connection = cn

    cmdFoto.CommandType = CommandType.Text

    Dim daFoto As New OleDbDataAdapter(cmdFoto)

    Dim dsFoto As New DataSet

    daFoto.Fill(dsFoto)

    Dim bits As Byte() = CType(dsFoto.Tables(0).Rows(0).Item(0), Byte())

    Dim memorybits As New MemoryStream(bits)

    Dim bitmap As New Bitmap(memorybits)

    foto.Image = bitmap

    cmdFoto.Dispose()

    dsFoto.Dispose()

    cmdFoto.Dispose()

    Catch EX As Exception

    'se não houver fotos gravadas irá ocorrer um erro que deve ser ignorado

    MessageBox.Show("Foto não gravada no Banco de Dados", "Não é possível exibir a foto", MessageBoxButtons.OK, MessageBoxIcon.Information)

    foto.Image = Nothing

    foto.Refresh()

    End Try

    Cn.Close()

    End Sub

    #End Region

     

     

    Thursday, August 21, 2008 1:16 PM

All replies

  • Sugiro que, caso a base de dados for ter mtos registros, ou vc guarda o caminho da foto usando Access ou vc usa o Sql Server 2005 (pode ser o Express) e guarda as imagens propriamente ditas.

    Agora, se for ter poucos registros, que não acarrete em um mdb mto grande, não vejo problema em guardar a imagem mesmo ao invés do caminho...

    Wednesday, January 24, 2007 5:11 PM
  • A quantidades de registros com fotos é de mais ou menos 10.000 registros.

    Quanto a usar SQL, não está nos planos por enquanto.

     

     

    Wednesday, January 24, 2007 9:51 PM
  • E ai pessoal

    Qual a orientação dos colegas ?

    Gravar as imagens no banco de dados ou gravar o caminho no banco de dados ?

     

    Thursday, January 25, 2007 1:46 PM
  • Minha opinião:

    Se as fotos forem ter muita qualidade, eu não recomendaria armazenar 10000 fotos propriamente ditas em um bd Access... Para armazenar as fotos mesmo (e não os caminhos), eu partiria pro Sql Server... Afinal de contas, vc pode usar o Sql Server 2005 Express, que é free e suporta até 4gb.

    Agora, se for armazenar os caminhos, na minha opinião, pode ser em Access mesmo, mas, tome cuidado com a consistência dos caminhos. Por exemplo, pode ser que alguém apague a foto da pasta que está armazenado o caminho no bd aí na hora de vc acessar vc não vai conseguir achar...

    Monday, January 29, 2007 11:53 AM
  • Estou com um grave problema que ninguem consegue resolver!!

    Criei um banco de dados ÓTIMO, porém não consigo fazer com que fotos apareçam nele.

    Tinha o Access 2003, e me falaram q esse era o problema. Instalei o 2007, e o problema continua

     

    As minhas fotos estão em BMP., mas sempre que tento inserir uma foto, ela aparece em forma de icone.

     

    Um amigo consegue colocar as fotos normalmente em seu Note, porém ele é um dos únicos, tendo em vista q no PC de outras pessoas ocorre o mesmo problema.  

    Ja atualizei meu windows, e fiz de tudo o que me disseram que poderia ser, mas não tem jeito.

    (UMA DICA DO QUE poderia ser o problema é que aparece "pacote" em vez de "imagem bmp", mas não consigo modificar!!)

     

    JA NÃO SEI OQ FAZER!!

     

    Alguém poderia me ajudar?

     

    Gto.

    Eduardo

    eduk01@hotmail.com
    Friday, August 01, 2008 8:10 PM
  • Viva, Eduardo!

     

    Não sei se já obteve alguma resposta ou solução, mas o recomendado para novas publicações é usar do botão "Nova Thread". Assim você cria e pode finalizar a publicação.

     

    Aguardo a sua publicação, se for o caso.

     

    Cumprimentos.

    Saturday, August 16, 2008 4:24 AM
  •  

    Gde Roberto!

     

    Ainda não consegui resolver o meu problema!!!

     

    Inclusive, baixei tantos tipos de programas diferente para tentar resolve-lo, que agora terei q formatar meu Note.

       (quase mudei para o SQL, infopath, excel, mas para mim, o melhor seria o access mesmo)

     

    1 amigo conseguiu utilizar o banco de dados que criei e incluir as fotos. Todos os outros (técnicos em computação como ele) não conseguiram em seus Pc´s, bem como eu!!

     

    Como posso resolver meu problema através desse botão "Nova Thread"?..... Onde esta esse botão?

     

    Meu msn é eduk01@hotmail.com 

     

    Fico extremamente agradecido a sua ajuda, haja vista que esse problema vem me assombrando a mais de 3 meses....

    Monday, August 18, 2008 5:15 AM
  • Viva, Eduardo!

     

    À esquerda superior você verá o botão "Entrar" que serve para que sua conta seja autenticada e por conseguinte você possa publicar, responder e até iniciar uma nova postagem. Faça o seu "log in" e verá, logo acima da publicação do Carlos Susviela, o botão "Nova Thread".

    Desta forma um Moderador do Fórum irá encaixar a sua publicação no lugar correto e você obterá respostas dessa turma especial.

     

    Esta publicação pode lhe ajudar?

    http://forums.microsoft.com/msdn-br/ShowPost.aspx?PostID=610247&SiteID=21

     

    Desejo sorte para você.

    Monday, August 18, 2008 7:34 AM
  • Eduardo

     

    Acho que voce poderia utilizar o Access mesmo para guarda as fotos

     

    Voce declara a coluna como Objeto Ole

     

    esse tipo de dados é ideal para se guardar dados referente a fotos

     

    para voce gravar voce joga a imagem como um array de bytes e quando voce for ler voce pega o array de bytes e cria a imagem.

     

     Public Function codificaImagem(ByVal imagem As Image) As Byte()
            Dim ms As New IO.MemoryStream()
            imagem.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg)

            Return ms.ToArray()
        End Function

     

        Public Function decodificaImagem(ByVal arrayImage As Byte()) As Image
            Dim ms As New IO.MemoryStream(arrayImage)
            Dim img As Image = Image.FromStream(ms)

            Return img
        End Function

     

    Abraço.

    Monday, August 18, 2008 4:39 PM
  •  

    Roberto,

     

    Como eu crio esse array de bytes e faço para ele ser lido tb...??

     

     

    MToooo obrigado pela ajuda!!

     

    Tuesday, August 19, 2008 6:26 PM
  • Eduardo

     

    No exemplo acima tem dois metodos

     

    um para codificar que recebe uma imagem como entrada e retorna um array

     

    e outro para decodificar que pega um array e transforma em uma imagem.

     

    Como utilizar.

     

    o codificar voce vai utilizar para gravar a imagem exemplo

     

    dim dr as DataRow = ds.Tables(0).NewRow();

     

    dr("Imagem") = codificarImagem("minhaImagem");  'Como eu te falei o campo no banco tem que estar como Objeto Ole para que possa funcionar

     

    e para voce resgatar a imagem voce vai passar o array que voce gravou no banco

     

    dim img as Image = decodificarImagem(dr("Imagem"));

     

    Espero que voce  tenha entendido.

     

    Abraço.

     

    Wednesday, August 20, 2008 12:35 PM
  •  

    Eduardo uso a rotina abaixo para gravar fotos no meu banco ACCESS, no banco tenho um StoreProcedure(uma consulta atualização)

     

    Veja  a consulta em SQL

    PARAMETERS codigo Long, imagem LongBinary;
    UPDATE tblpr SET tblpr.FOTO = [imagem]
    WHERE (((tblpr.ID)=[codigo]));

     

    Code Snippet

    #Region "Rotinas Imagem"

    Private Function GravarImagem(ByVal codigoCliente As Integer) As Boolean

    'Define variaveis para gravar a imagem

    cn.Close()

    cn.Open()

    Dim SalvaImagem As Boolean = False

    Dim nomeArquivo As String = ""

    Try

    'buscamos a imagem a ser gravada

    Dim openDlg As OpenFileDialog = New OpenFileDialog

    openDlg.Filter = "(Jpeg Files) *.jpg | *.jpg"

    Dim filter As String = openDlg.Filter

    openDlg.Title = "Selecione um arquivo JPG para inserir no campo Foto"

    'abre a janela de diáglogo para procurar o arquivo a ser usado como imagem

    If (openDlg.ShowDialog() = Windows.Forms.DialogResult.OK) Then

    nomeArquivo = openDlg.FileName

    SalvaImagem = True

    Else

    Return False

    Exit Function

    End If

    'se uma imagem foi selecionada então inicia a gravação

    If SalvaImagem = True Then

    'Carrega a foto

    Dim fsFoto As FileStream

    fsFoto = New FileStream(nomeArquivo, FileMode.Open)

    Dim fiFoto As FileInfo = New FileInfo(nomeArquivo)

    Dim Temp As Long = fiFoto.Length

    Dim lung As Long = Convert.ToInt32(Temp)

    Dim picture(lung) As Byte

    'le a imagem

    fsFoto.Read(picture, 0, lung)

    fsFoto.Close()

    'cria um novo objeto command usando a stored procedure ja criada na base de dados

    Dim cmdFoto As New OleDbCommand("spFotoPr", cn)

    cmdFoto.CommandType = CommandType.StoredProcedure

    'recebe os parametros para a stored procedure spCarregaFoto

    Dim sql_codigoCliente = New OleDbParameter("CODIGO", codigoCliente)

    Dim sql_Foto As New OleDbParameter("IMAGEM", OleDbType.LongVarBinary)

    sql_Foto.Value = picture

    'adicona os parametros informados

    cmdFoto.Parameters.Add(sql_codigoCliente)

    cmdFoto.Parameters.Add(sql_Foto)

    'executa a stored procedures usando os parâmetros informados

    cmdFoto.ExecuteNonQuery()

    cmdFoto.Dispose()

    sql_Foto = Nothing

    picture = Nothing

    Return True

    Exit Function

    End If

    Catch ex As Exception

    MessageBox.Show(ex.Message)

    Return False

    End Try

    cn.Close()

    End Function

     

    Private Sub CarregarImagem(ByVal codCliente As Integer)

    Try

    'Carregar a foto

    cn.Open()

    Dim cmdFoto As New OleDb.OleDbCommand("select FOTO from tblpr where id = " & codCliente)

    cmdFoto.Connection = cn

    cmdFoto.CommandType = CommandType.Text

    Dim daFoto As New OleDbDataAdapter(cmdFoto)

    Dim dsFoto As New DataSet

    daFoto.Fill(dsFoto)

    Dim bits As Byte() = CType(dsFoto.Tables(0).Rows(0).Item(0), Byte())

    Dim memorybits As New MemoryStream(bits)

    Dim bitmap As New Bitmap(memorybits)

    foto.Image = bitmap

    cmdFoto.Dispose()

    dsFoto.Dispose()

    cmdFoto.Dispose()

    Catch EX As Exception

    'se não houver fotos gravadas irá ocorrer um erro que deve ser ignorado

    MessageBox.Show("Foto não gravada no Banco de Dados", "Não é possível exibir a foto", MessageBoxButtons.OK, MessageBoxIcon.Information)

    foto.Image = Nothing

    foto.Refresh()

    End Try

    Cn.Close()

    End Sub

    #End Region

     

     

    Thursday, August 21, 2008 1:16 PM