• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Mr. Henriquez

Inserir ficheiro numa base de dados MySql com vb.net

14 mensagens neste tópico

Boas...

Ando a tentar saber como posso inserir numa base de dados MySql um ficheiro de word.

Na tabela da base de dados, tenho um campo blob, para inserir os ficheiros, mas não tou a conseguir.

Se me puderem ajudar com esta questão.

Agradeço.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas Novamente,

Já tentei de todas as formas e feitios por um ficheiro word na base de dados. E não encontro na web uma forma simples e ou pelo menos uma explicação clara de como inserir um ficheiro numa base de dados mysql.

Já vi os links que me enviaram, mas não percebi... :S Acho que já tou a precisar de férias...

Se me puderem ajudar com exemplos de código, ou mais tutoriais. Agradeço!

Cumps,

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Fiz algo similar para inserir uns PDFs em uma bd em MS SQL 2005..

Vê se compreendes..

    Public Function BinaryToDb(ByVal oCon As SqlConnection, _
                               ByVal sQuery As String, _
                               ByVal sField As String, _
                               ByVal sFilePath As String) As Boolean
        Try
            ' Exemplo..
            ' BinaryToDb(oCon, "INSERT INTO pdf_enviados(id_utilizador, data, destino, resultado, pdf) VALUES(1234, " & EncodingDataTimeSQL(Now) & ", '321', 'desconhecido', ?XD)", "pdf", "C:\teste.pdf")
            Dim bytPic() As Byte = File.ReadAllBytes(sFilePath)

            Using oCommand As New SqlCommand(sQuery, oCon)
                'ajuda em: http://forums.mysql.com/read.php?38,6172,6172
                Dim prm As New SqlParameter("@XD", _
                               SqlDbType.Binary, bytPic.Length, _
                               ParameterDirection.Input, False, _
                               0, 0, Nothing, DataRowVersion.Current, bytPic)

                oCommand.Parameters.Add(prm)
                oCommand.ExecuteNonQuery()
            End Using

            Return True
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Function

Qualquer duvida apita..

Compr.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

Consegui, então aplicar o código, à partida, ele está a inserir na base de dados.

Agora tenho outro pequeno problema:

Eu preciso verificar, se ele está a guardar correctamente o ficheiro na base de dados.

Acontece que eu para ler o ficheiro da base de dados estou a usar um datareader e estou a tentar carregá-lo para um fileStream, quando me dá o seguinte erro:

"Conversion from type 'byte()' to type 'String' is not valid.

Estou confuso, porque nunca trabalhei tão a fundo com ficheiros e bases de dados, e o meu know-how sobre este tema é bastante limitado.

Toda a ajuda é bem-vinda.

Cumps,

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Porque não testas descarregando o ficheiro para disco e comparando com o original?

Não há melhor teste do que garantir que a cópia é uma réplica exacta do original.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois, eu abro a base de dados e não vejo o ficheiro no campo, ele apenas me diz Blob.

Não consigo de maneira nenhuma extrair o ficheiro da base para um local, onde o possa abrir e verificar o tamanho, etc..

Quem diz não consigo, diz não sei, porque é a primeira vez que estou a tentar guardar ficheiros em base de dados.

Mas se souberes como posso fazer isso em mySql, fico agradecido.

Mais uma vez toda a ajuda é bem-vinda.

Cumps,

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para carregar o ficheiro.. fazes como se estives ses a carregar um coluna normal.. so quando receberes o valores.. terás de carregar com uma variavel em bytes array..

tipo isto:

Dim bytDoc() As Byte = objDR.Item("campo_da_tabela")

Porque se reparares a propriedade Item do datareader.. é do tipo Object, isto significa que é possível carregar qualquer tipo de dados.. no caso do doc em questão o tipo será bytes()

Caso queiras guardar para ficheiro.. sé terás de fazer isto:

IO.File.WriteAllBytes(path, bytDoc)

Compr

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acabei de aplicar o código e o ficheiro já carrega para a richtextbox.

Porém verifiquei que o mesmo perdeu toda a formatação que tinha, isto é normal?

E há maneira de evitar que ele perca a formatação?

Desde já muito obrigado por dispensarem o vosso tempo com esta situação.

Cumps,

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso pode ser porque a RichTextBox não está configurada correctamente ou então não suporta (e por isso ignora) a formatação. Mas pelo que me lembro isso suportava RTF sem problema, sendo um .DOC é capaz de conseguir apenas recuperar o texto.

Em vez de mostrares nesse componente, grava o ficheiro para disco e abre com o Word (ou compatível).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu acho que não deves estar a salvar correctamente os dados do richtextbox..

Coloca aqui o código que utilizas a inserir os dados na bd.. talvez assim te possa ajudar melhor.. :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

O código inserido é exactamente igual ao teu mas poderá ser a query que está mal feita, qualquer das formas aqui vai:

  Function saveFile()

       

        Dim sfield As String = "SEGMENTACAO"

        Dim sQuery As String = "INSERT INTO PROPOSTA_TITULAR (ID_ENTIDADE, SEGMENTACAO, CAMPOS_FORNECER, QUANTIDADE_PREVISTA, OBSERVACOES, RECEPCAO_PREVISTA, ENTREGA_PREVISTA, ID_COLABORADOR, ID_PROPOSTA) "

        sQuery = sQuery & " VALUES ( " & CInt(Me.cbTitular.SelectedValue(0)) & ", '" & Me.propText.Text & "', 'Morada' , 2000 , 'Teste1', '2009-07-06', '2009-07-07', '" & My.Forms.Main2.uName.Text & "', '" & Me.propTxt.Text & "')"

        Dim sFilePath As String = "C:\" & Me.propTxt.Text & ".doc"

        Try

            If proClienteMS.State = ConnectionState.Closed Then

                Call openConnection()

            Else

                proClienteMS.Close()

                Call openConnection()

            End If

            ' Exemplo..

            ' BinaryToDb(oCon, "INSERT INTO pdf_enviados(id_utilizador, data, destino, resultado, pdf) VALUES(1234, " & EncodingDataTimeSQL(Now) & ", '321', 'desconhecido', ?XD)", "pdf", "C:\teste.pdf")

            Dim bytPic() As Byte = File.ReadAllBytes(sFilePath)

            Using oCommand As New MySqlCommand(sQuery, proClienteMS)

                'ajuda em: http://forums.mysql.com/read.php?38,6172,6172

                Dim prm As New MySqlParameter("@XD", _

                              SqlDbType.Binary, bytPic.Length, _

                              ParameterDirection.Input, False, _

                              0, 0, Nothing, DataRowVersion.Current, bytPic)

                oCommand.Parameters.Add(prm)

                oCommand.ExecuteNonQuery()

            End Using

            Return True

        Catch ex As Exception

            MessageBox.Show(ex.Message)

        End Try

    End Function

Obrigado pela disposição.

Cumps,

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Troca esta linha de código:

        sQuery = sQuery & " VALUES ( " & CInt(Me.cbTitular.SelectedValue(0)) & ", ?XD, 'Morada' , 2000 , 'Teste1', '2009-07-06', '2009-07-07', '" & My.Forms.Main2.uName.Text & "', '" & Me.propTxt.Text & "')"

Quando fazes o query.. na parte do insert dos valor do respectivo doc.. tens de colocar o parâmetro que foi definido neste caso como ?XD

Estavas a colocar o nome do ficheiro..

Experimenta assim que deve funcionar..

Uma observação..

Estás a utilizar uma Function que não retorna nada..

Nesse caso ficaria melhor como Sub, normalmente as Functions retornam valores :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas novamente,

Eu pus na query então no lugar da richtextbox o parametro com "?XD", tal como me disseste e recebo uma excepção: Parameter '?XD' must be defined.

Então pus o nome do parameter @XD no lugar da tichtexbox, mas recebo então a excepcao a dizer:

Column 'SEGMENTACAO' cannot be NULL.

Ja mudei o connector do mysql, mas sinceramente penso que não seja um problema do mysql connector.

Cumps,

0

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