Jump to content
diego_10

Chamar imagem da base de dados (Sql)

Recommended Posts

diego_10

Bom dia,

Tenho um onde posso actualizar o background da minha aplicaçao com imagens, e entao é o seguinte:

Guardo na minha base de dados um nome(Varchar(25)) e uma imagem( Image ), e faço o insert, ate aqui tudo bem, a imagem fica na base de dados como <Binary data>

Agora para carregar a imagem da base de dados é que esta a dar erro:

 
Private Sub carregaimagem(ByVal idImagem As Integer)

        Dim conImage As New SqlConnection(Ler_String_Conexao(ofdTeste))

        Try
            Dim cmdfoto As New SqlCommand("Select Imagem from ImagemBackground where IDImagem = " & cbxbackground.SelectedValue)
            cmdfoto.Connection = conImage
            cmdfoto.CommandType = CommandType.Text
            Dim dafoto As New SqlDataAdapter(cmdfoto)
            Dim dsfoto As New DataSet()

            dafoto.Fill(dsfoto)

            Dim bits As Byte() = CType(dsfoto.Tables(0).Rows(0).Item(0), Byte())
            Dim ImagemMemoria As New MemoryStream(bits)
            'Dim bitmap As New Bitmap(memorybits)
            picImagem.Image = Image.FromStream(ImagemMemoria)
            'picImagem.Image = bitmap
            cmdfoto.Dispose()
            dsfoto.Dispose()
            cmdfoto.Dispose()

        Catch ex As Exception
            MsgBox("ERRO: " & ex.Message)
            picImagem.Image = Nothing
            picImagem.Refresh()
        End Try

    End Sub 

Quando passa na linha de codigo onde esta a vermelho da-me "Parameter is not valid"

Alguem da uma ajuda como resolver isto?

Cumprimentos a todos!

Share this post


Link to post
Share on other sites
bioshock

Troca:

picImagem.Image = Image.FromStream(ImagemMemoria)

Por:

picImagem.Image = New Bitmap(ImagemMemoria)

Share this post


Link to post
Share on other sites
diego_10

Boas bioshock,

Já troquei, mas continua igual.

Parameter is not valid

Cumprimentos,

Diego Leite

Share this post


Link to post
Share on other sites
bioshock

Eu posso-te dar outra forma de fazeres isso, mas isso deve funcionar como eu disse. No entanto, detectei um erro nesse teu sub. Porque raio estâncias

Private Sub carregaimagem(ByVal idImagem As Integer)

...? Pois não utilizas a variável idImagem em lado nenhum.

O que deves fazer é instanciar essa variável e depois na tua query em vez de:

Dim cmdfoto As New SqlCommand("Select Imagem from ImagemBackground where IDImagem = " & cbxbackground.SelectedValue)

Deves ter:

Dim cmdfoto As New SqlCommand("Select Imagem from ImagemBackground where IDImagem = " & idImagem)

E aqui sim, faz todo o sentido teres instanciado a variável.

Agora, para chamares o sub em qualquer lado, deves proceder desta forma:

carregaimagem(cbxbackground.SelectedValue)

Se isto não funcionar, let me know. ;)

Share this post


Link to post
Share on other sites
diego_10

Boas,

Pois tens razao, eu estava a passar o mesmo, mas mesmo assim o codigo vai passando, mas quando chega aquela parte do codigo que te mostrei da-me erro e diz-me "Parameter is not Valid"


picImagem.Image = New Bitmap(ImagemMemoria)

Cumprimentos,

Diego Leite

Share this post


Link to post
Share on other sites
bioshock
Dim SqlConnection As New SqlConnection(basedados)
        Dim SqlQuery As String = "Select Imagem from ImagemBackground where IDImagem = " & idImagem
        Dim SqlCommand As New SqlCommand(SqlQuery, SqlConnection)
        SqlConnection.Open()
        Dim bits As Byte(), SqlReader As SqlDataReader
        SqlReader = SqlCommand.ExecuteReader
        While SqlReader.Read
            bits = CType(SqlReader("Imagem"), Byte())
            Dim MStream As IO.MemoryStream = New IO.MemoryStream(bits)
            picImagem.Image = New Bitmap(MStream)
        End While

Share this post


Link to post
Share on other sites
diego_10

Boas,

Esta a dar erro na mesma:

picImagem.Image = New Bitmap(MStream)

Queres que mostre como estou a inserir para ver se tem algum problema com isso?

Cumprimentos

Share this post


Link to post
Share on other sites
bioshock

Está a dar erro na mesma? Então já tens outro problema por trás, porque esse código funciona.

Sim, deves estar a inserir mal de certeza.

Share this post


Link to post
Share on other sites
diego_10

Entao é o seguinte:

Este é o codigo do botao inserir:

    Private Sub btnIncluiLista_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnIncluiLista.Click

        'se há alguma informação na caixa de texto então inclui na lista senão avisa e sai
        If txtImagem.TextLength <= 0 Then
            MessageBox.Show("Selecione um arquivo...", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button3)

        Else
            If txtnome.Text <> "" And txtImagem.Text <> "" Then
                InsertImagem(txtnome.Text, Image.FromFile(txtImagem.Text), Ler_String_Conexao(ofdTeste))
                listarImagens(lstImagem, Ler_String_Conexao(ofdTeste))
                MsgBox(" Registo Inserido com sucesso! ", MsgBoxStyle.Information, "Aviso")
                txtnome.Text = ""
                txtImagem.Text = ""
                txtnome.Focus()
            Else
                MsgBox("Campos por Preencher! ", MsgBoxStyle.Information, "Aviso")
            End If

            End If

    End Sub

Este é o Sub InsertImagem

Sub InsertImagem(ByVal nome As String, ByVal Imagem As Image, ByVal conexao As String)

        Try

            Dim con As New SqlConnection(conexao)

            Dim sql As String = _
            "INSERT INTO ImagemBackground(Nome,Imagem) VALUES('" & nome & "','" & ImageConversion(Imagem) & "')"

            Dim comando As New SqlCommand(sql, con)

            con.Open()


            comando.CommandText = sql

            comando.ExecuteNonQuery()
            con.Close()

        Catch ex As Exception
            MsgBox("Erro: " & ex.Message)
        End Try

    End Sub

Aqui é onde converte a imagem:

Public Function ImageConversion(ByVal image As System.Drawing.Image) As String        

        If image Is Nothing Then Return ""
        Dim memoryStream As System.IO.MemoryStream = New System.IO.MemoryStream
        image.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Jpeg)
        Dim value As String = ""
        For intCnt As Integer = 0 To memoryStream.ToArray.Length - 1
            value = value & memoryStream.ToArray(intCnt) & ","
        Next
        Return value

    End Function

Este é o meu metodo de inserir.

Cumprimentos

Share this post


Link to post
Share on other sites
diego_10

Boas bioshock

Alterei o campo mas nao resultou.

Tenho de ver a outra maneira.

Cumprimentos

Share this post


Link to post
Share on other sites
bioshock

Da forma que eu coloquei aí tem de funcionar, é a forma que eu utilizo.

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

×
×
  • 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.