Ir para o conteúdo
joaogomes

como guardar uma imagem de fundo no MySQL

Mensagens Recomendadas

joaogomes    1
joaogomes

Bom dia.

Eu fui o autor do tópico como guardar uma imagem de fundo nos settings, mas decidi seguir o conselho do bioshock e guardá-la numa bd. Este é o código que tenho para mudar o valor na BD e depois para o ler no form_load():

  Private Sub AlterarOFundoDaAplicaçãoToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AlterarOFundoDaAplicaçãoToolStripMenuItem.Click
        Dim FolderDialog3 As New OpenFileDialog
        If FolderDialog3.ShowDialog = Windows.Forms.DialogResult.OK Then
            Try
                BackgroundImage = New System.Drawing.Bitmap(FolderDialog3.FileName)
                Try
                    Dim ligacao As String = My.Settings.voluntariadoConnectionString
                    Dim db As New MySqlConnection(ligacao)
                    db.Open()

                    Dim varsql As String
                    varsql = "INSERT INTO fundo values(1,'" & FolderDialog3.FileName & "')"

                    Dim cmd As New MySqlCommand(varsql, db)
                    cmd.ExecuteScalar()
                    db.Close()
                    MsgBox("Alteração do fundo da aplicação realizada com Sucesso.", MsgBoxStyle.Information)
                Catch ex As Exception

                    Dim ligacao As String = My.Settings.voluntariadoConnectionString
                    Dim db As New MySqlConnection(ligacao)
                    db.Open()

                    Dim varsql As String
                    varsql = "UPDATE fundo SET imagem = '" & FolderDialog3.FileName & "' WHERE id=1"

                    Dim cmd As New MySqlCommand(varsql, db)
                    cmd.ExecuteScalar()
                    db.Close()
                    MsgBox("Alteração do fundo da aplicação realizada com Sucesso.", MsgBoxStyle.Information)
                End Try

            Catch ex As Exception

                MsgBox("Erro ao fazer a alteração do fundo da aplicação.Tente novamente.", MsgBoxStyle.Critical, "Erro")

            End Try
        Else
                MsgBox("Alteração do fundo da aplicação cancelada.", MsgBoxStyle.Information)
        End If
    End Sub

    Private Sub Principal_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Try
            Dim ligacao As String = My.Settings.voluntariadoConnectionString
            Dim db As New MySqlConnection(ligacao)
            db.Open()

            Dim varsql As String
            varsql = "SELECT imagem FROM fundo"

            Dim cmd As New MySqlCommand(varsql, db)
            Dim dr As MySqlDataReader
            dr = cmd.ExecuteReader
            'Dim info As String = ""
            While dr.Read
                'info = dr.Item(1)
                BackgroundImage = New System.Drawing.Bitmap(dr.Item(0).ToString)
            End While
            db.Close()
        Catch ex As Exception
            BackgroundImage = Nothing
        End Try
    End Sub

O fundo é alterado e o valor tb é alterado na BD, contudo não está a gravar correctamente o camninho, faltam as barras \

O que faz com que depois no form_load() salte para a excepção visto que o caminho está errado.

Isto é estranho porque já guardei caminhos de imagens anteriormente numa BD e ficaram bem e depois conseguia vê-las na picturebox. Agora esta questão com o fundo de trabalho é que não sei. Obrigado.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
bioshock    170
bioshock

Mas olha lá, se queres só guardar o caminho da imagem e se é só uma imagem, não precisas de utilizar uma base de dados só para isso..os Settings chegavam-te perfeitamente.

varsql = "SELECT imagem FROM fundo"

Troca para:

varsql = "SELECT imagem FROM fundo WHERE ID = 1"

E em vez de:

BackgroundImage = New System.Drawing.Bitmap(dr.Item(0).ToString)

coloca:

BackgroundImage = Image.FromFile(dr.Item(0).ToString)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
joaogomes    1
joaogomes

Já experimentei a solução do bioshock, mas continua na mesma. O problema está no modo como a imagem é salva. O caminho que é salvo não é o correcto. Faltam as barras (/).

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
bioshock    170
bioshock

Após isto:

If FolderDialog3.ShowDialog = Windows.Forms.DialogResult.OK Then

Escreve isto:

MsgBox(FolderDialog3.FileName)

E vê se ele te está a devolver em condições o caminho tal e qual tu queres.

Já agora ele esta-te a colocar c:/whatever/img.png ou c:\whatever\img.png?

Se o problema é as barras estarem ao contrário podes fazer um replace disso.

BackgroundImage = Image.FromFile(dr.Item(0).ToString.Replace("/", "\"))

Se bem que o problema não deriva daí. Ele tem que te colocar o caminho tal e qual lhe dizes.

Edit: Aproveita e vê o que está a devolver para tirares as teimas:

MsgBox(dr.Item(0).ToString)

Se tu inseres C:\ - na base de dados vai aparecer C:\ - não tenhas dúvidas.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
joaogomes    1
joaogomes

O problema não está na colocação das barras. Nem sequer me coloca as barras na base de dados. Vou dar um exemplo:

Isto lê o caminho correctamente:

C:\Documents and Settings\Francisco\My Documents\Visual Studio 2008\Projects\Voluntariado3\icones\hospital.jpg

Mas grava na base de dados da seguinte forma:

C:Documents and SettingsFranciscoMy DocumentsVisual Studio 2008ProjectsVoluntariado3iconeshospital.jpg

Ou seja sem barras

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
bioshock    170
bioshock

Lol. Qual o tipo de dados do campo em questão?

Também reparei agora que essa não é a instrução correcta - apesar de ser funcional - . Coloca antes assim:

INSERT INTO Tabela([iD], [Campo]) VALUES (1, C:\Img.png)

Para verificares se ele te coloca a barra \

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
joaogomes    1
joaogomes

Bom dia. Já consegui resolver. Deixo aqui o código:

    Private Sub AlterarOFundoDaAplicaçãoToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AlterarOFundoDaAplicaçãoToolStripMenuItem.Click
        Dim FolderDialog3 As New OpenFileDialog
        If FolderDialog3.ShowDialog = Windows.Forms.DialogResult.OK Then
            Try
                MsgBox(FolderDialog3.FileName)
                BackgroundImage = New System.Drawing.Bitmap(FolderDialog3.FileName)
                Try
                    Dim ligacao As String = My.Settings.voluntariadoConnectionString
                    Dim db As New MySqlConnection(ligacao)
                    db.Open()

                    Dim varsql As String
                    varsql = "INSERT INTO fundo values(1,'" & FolderDialog3.FileName.ToString.Replace("\", "\\") & "')"

                    Dim cmd As New MySqlCommand(varsql, db)
                    cmd.ExecuteScalar()
                    db.Close()
                    MsgBox("Alteração do fundo da aplicação realizada com Sucesso.", MsgBoxStyle.Information)
                Catch ex As Exception

                    Dim ligacao As String = My.Settings.voluntariadoConnectionString
                    Dim db As New MySqlConnection(ligacao)
                    db.Open()

                    Dim varsql As String
                    varsql = "UPDATE fundo SET imagem = '" & FolderDialog3.FileName.ToString.Replace("\", "\\") & "' WHERE id=1"

                    Dim cmd As New MySqlCommand(varsql, db)
                    cmd.ExecuteScalar()
                    db.Close()
                    MsgBox("Alteração do fundo da aplicação realizada com Sucesso.", MsgBoxStyle.Information)
                End Try

            Catch ex As Exception

                MsgBox("Erro ao fazer a alteração do fundo da aplicação.Tente novamente.", MsgBoxStyle.Critical, "Erro")

            End Try
        Else
                MsgBox("Alteração do fundo da aplicação cancelada.", MsgBoxStyle.Information)
        End If
    End Sub

    Private Sub Principal_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Try
            Dim ligacao As String = My.Settings.voluntariadoConnectionString
            Dim db As New MySqlConnection(ligacao)
            db.Open()

            Dim varsql As String
            varsql = "SELECT imagem FROM fundo WHERE id=1"

            Dim cmd As New MySqlCommand(varsql, db)
            Dim dr As MySqlDataReader
            dr = cmd.ExecuteReader
            'Dim info As String = ""
            While dr.Read
                'info = dr.Item(1)
                BackgroundImage = New System.Drawing.Bitmap(dr.Item(0).ToString)
                'MsgBox(dr.Item(0).ToString)
                'BackgroundImage = Image.FromFile(dr.Item(0).ToString)
            End While
            db.Close()
        Catch ex As Exception
            BackgroundImage = Nothing
        End Try
    End Sub

Era preciso fazer isto:

FolderDialog3.FileName.ToString.Replace("\", "\\")

Fazer escape da barra, ou seja, substitui a \ por \\ e funciona. Obrigado.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
bioshock    170
bioshock

Essa é uma solução não convencional apesar de funcional. Se fizesses os devidos testes que te disse verificavas desde logo de onde vinha o problema, que provavelmente está no tipo de dados.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade