Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Ilano

Objeto para gravar arquivos no banco de dados MySQL

Recommended Posts

Olá pessoal,

Tenho tenho a classe de objeto (objArquivos) abaixo para fazer inserts, updates, deletes e consultas de arquivos em uma base de dados MySQL, mas não está dando certo para incluir os arquivos. Preciso corrigir as linhas em vermelho para executar os inserts e updates dos arquivos corretamente para qualquer tipo de arquivo.

 

 

 

 

Imports Microsoft.VisualBasic
Imports MySql.Data.MySqlClient
Namespace Protocolo
Public Class objArquivos
Dim strConexao = ConfigurationManager.AppSettings("cStrConexao")
Dim adapter As New MySqlDataAdapter()
Dim vlCodigo As Integer
Dim vlTarefa As Integer
Dim vlNome As String
Dim vlUpload As Byte
Property Codigo()
Get
Return vlCodigo
End Get
Set(ByVal value)
vlCodigo = value
End Set
End Property
Property Tarefa()
Get
Return vlTarefa
End Get
Set(ByVal value)
vlTarefa = value
End Set
End Property
Property Nome()
Get
Return vlNome
End Get
Set(ByVal value)
vlNome = value
End Set
End Property
Property Upload()
Get
Return vlUpload
End Get
Set(ByVal value)
vlUpload = value
End Set
End Property
Public Function AssociaDados(ByVal pLabel As WebControls.Label)
Dim Ds As Data.DataSet
Dim pTeste As String
If vlCodigo > 0 Then pTeste = "Arquivo_Codigo <> " & vlCodigo & " AND " Else pTeste = DBNull.Value.ToString
Try
Ds = Duplicidade(pTeste & _
" Tarefa_Codigo = " & vlTarefa & _
" AND Arquivo_Nome = '" & Trim(vlNome) & "' ")
If Not Ds Is Nothing Then
If Ds.Tables(0).Rows.Count = 0 Then
If vlCodigo = 0 Then Incluir(pLabel) Else Alterar(pLabel)
Else
If Ds.Tables(0).Rows.Count > 0 Then
pLabel.CssClass = "label confirma"
pLabel.Text = "Este registro já foi cadastrado!!!"
End If
End If
Else
If Ds Is Nothing Then
End If
End If
Catch ex As Exception
pLabel.CssClass = "label erro"
pLabel.Text = "Ocorreu um erro ao tentar salvar este registro:<br />" & ex.Message
End Try
End Function
Public Function Incluir(ByVal pLabel As WebControls.Label)
Dim conexaoMySQL As MySqlConnection
Dim Cm As New MySqlCommand
Dim SQL As New System.Text.StringBuilder
Dim Conexao As String
Conexao = ConfigurationManager.AppSettings("cStrConexao")
conexaoMySQL = New MySqlConnection(Conexao)
Try
SQL.Append(" INSERT INTO d003_arquivos (Tarefa_Codigo, Arquivo_Nome, Arquivo_Upload) ")
SQL.Append(" VALUES (?Tarefa, ?Nome, ?Upload) ")
With Cm.Parameters
.Add(New MySqlParameter("?Tarefa", vlTarefa))
.Add(New MySqlParameter("?Nome", Trim(vlNome)))
.Add(New MySqlParameter("?Upload", vlUpload.ToString))
End With
Cm.Connection = conexaoMySQL
Cm.CommandText = SQL.ToString
conexaoMySQL.Open()
Cm.ExecuteNonQuery()
conexaoMySQL.Close()
pLabel.CssClass = "label confirma"
pLabel.Text = "Registro cadastrado com sucesso!!!"
Catch ex As Exception
pLabel.CssClass = "label erro"
pLabel.Text = "Ocorreu um erro ao tentar salvar este registro:<br />" & ex.Message
End Try
End Function
Public Function Alterar(ByVal pLabel As WebControls.Label)
Dim conexaoMySQL As MySqlConnection
Dim Cm As New MySqlCommand
Dim SQL As New System.Text.StringBuilder
Dim Conexao As String
Conexao = ConfigurationManager.AppSettings("cStrConexao")
conexaoMySQL = New MySqlConnection(Conexao)
Try
SQL.Append(" UPDATE d003_arquivos SET ")
SQL.Append(" Tarefa_Codigo = ?Tarefa, ")
SQL.Append(" Arquivo_Nome = ?Nome, ")
SQL.Append(" Arquivo_Upload = ?Upload ")
SQL.Append(" WHERE Arquivo_Codigo = ?Codigo ")
With Cm.Parameters
.Add(New MySqlParameter("?Tarefa", vlTarefa))
.Add(New MySqlParameter("?Nome", Trim(vlNome)))
.Add(New MySqlParameter("?Upload", vlUpload.ToString))
.Add(New MySqlParameter("?Codigo", vlCodigo))
End With
Cm.Connection = conexaoMySQL
Cm.CommandText = SQL.ToString
conexaoMySQL.Open()
Cm.ExecuteNonQuery()
conexaoMySQL.Close()
pLabel.CssClass = "label confirma"
pLabel.Text = "Registro alterado com sucesso!!!"
Catch ex As Exception
pLabel.CssClass = "label erro"
pLabel.Text = "Ocorreu um erro ao tentar salvar este registro:<br />" & ex.Message
End Try
End Function
Public Function Excluir()
Dim conexaoMySQL As MySqlConnection
Dim Cm As New MySqlCommand
Dim SQL As New System.Text.StringBuilder
Dim Conexao As String
Conexao = ConfigurationManager.AppSettings("cStrConexao")
conexaoMySQL = New MySqlConnection(Conexao)
SQL.Append(" DELETE FROM d003_arquivos ")
SQL.Append(" WHERE Arquivo_Codigo = " & vlCodigo)
Cm.Connection = conexaoMySQL
Cm.CommandText = SQL.ToString
conexaoMySQL.Open()
Cm.ExecuteNonQuery()
conexaoMySQL.Close()
End Function
Public Function Consultar(ByVal pParametro As String, ByVal pOrdem As String) As Data.DataSet
Dim Cm As New MySqlCommand
Dim SQL As New System.Text.StringBuilder
Dim Conexao As New MySqlConnection(strConexao)
Dim Ds As Data.DataSet
Dim Da As MySqlDataAdapter
SQL.Append(" SELECT A.Arquivo_Codigo, A.Tarefa_Codigo, A.Arquivo_Nome, A.Arquivo_Upload ")
SQL.Append(" FROM d003_arquivos A ")
If Trim(pParametro) <> "" Then SQL.Append(" WHERE " & pParametro & "")
If Trim(pOrdem) <> DBNull.Value.ToString Then SQL.Append(" ORDER BY " & pOrdem & " ") Else SQL.Append(" ORDER BY A.Tarefa_Codigo, A.Arquivo_Nome ")
Da = New MySqlDataAdapter(SQL.ToString, Conexao)
Conexao.Open()
Ds = New Data.DataSet
Da.Fill(Ds)
Conexao.Close()
Return Ds
End Function
Public Function Duplicidade(ByVal pParametro As String) As Data.DataSet
Dim conexaoMySQL As MySqlConnection
Dim Da As MySqlDataAdapter
Dim Ds As Data.DataSet
Dim SQL As New System.Text.StringBuilder
Dim Conexao As String
Conexao = ConfigurationManager.AppSettings("cStrConexao")
conexaoMySQL = New MySqlConnection(Conexao)
SQL.Append(" SELECT Arquivo_Codigo, Tarefa_Codigo, Arquivo_Nome ")
SQL.Append(" FROM d003_arquivos ")
If Trim(pParametro) <> "" Then SQL.Append(" WHERE " & pParametro & "")
Da = New MySqlDataAdapter(SQL.ToString, conexaoMySQL)
conexaoMySQL.Open()
Ds = New Data.DataSet
Da.Fill(Ds)
conexaoMySQL.Close()
Return Ds
End Function
End Class
End Namespace

 

Já no evento Click do botão tenho o código abaixo:

 

 

 

 

Dim Gi As DataGridItem
Dim pContador, pArquivo, pMensagem1, pMensagem2 As WebControls.Label
Dim pUpload As WebControls.FileUpload
Dim I As Integer
I = 0
For Each Gi In DataGrid1.Items
pContador = Gi.Cells(0).FindControl("gLbContador")
pUpload = Gi.Cells(1).FindControl("gFileUpload1")
pArquivo = Gi.Cells(2).FindControl("gLbArquivo")
pMensagem1 = Gi.Cells(2).FindControl("gLbMensagem1")
pMensagem2 = Gi.Cells(2).FindControl("gLbMensagem2")
With DataGrid1
With Arquivo
.Codigo = 0
.Tarefa = LbCodigo.Text
.Nome = pUpload.FileName
.Upload = pUpload.FileName
End With
Arquivo.Incluir(pMensagem2)
End With
Next

 

Grato,

 

Ilano.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O upload é do tipo Byte() (um array de bytes) e não um Byte simples, essa é a primeira correção.

 

Depois, para executar e atribuir um valor você precisa usar um controle "FileUpload" e atribuir mais ou menos assim:

Dim Upload As Byte() = FileUpload1.FileBytes

Ai depois no SQL é só adicionar o parâmetro:

 

comando.Parameters.AddWithValue("nome",Upload)

E você quer inserir um arquivo, isso significa que NUNCA o upload pode aparecer com ToString(), JAMAIS! E para tanto seu banco de dados precisa ter a coluna com o tipo Varbinary(MAX) ou Image para receber estes bytes.

 

No click, o que é o Upload?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá KhaosDoctor,

 

Desde já agradeço sua atenção. O Upload que tem no Click do botão é exatamente a propriedade da classe de objeto objArquivos.

Vou tentar adaptar o que você postou para a minha classe de objetos.



Bom, ele deu um erro no objeto objArquivos:

 

 

 

Property Upload()
Get
Return vlUpload
End Get
Set(ByVal value)
vlUpload = value
End Set
End Property
Não é possível converter um objeto do tipo 'System.String' no tipo 'System.Byte[]'.

 

 

 

 

Como posso corrigir isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

O tipo de upload tem que ser Byte(), tudo que for receber os bytes do arquivo deve ser como tipo Byte() e para você passar um valor para essa propriedade você também deve passar um valor do tipo byte(), logo valores string não podem ser atribuídos a este tipo de variável.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá KhaosDoctor,

 

Mais uma vez agradeço sua atenção. Bom, fiz as mudanças no objeto

 

 

 

 

Imports Microsoft.VisualBasic
Imports MySql.Data.MySqlClient
Namespace Protocolo
Public Class objArquivos
Dim strConexao = ConfigurationManager.AppSettings("cStrConexao")
'Dim Conexao As New MySqlConnection(strConexao)
Dim adapter As New MySqlDataAdapter()
Dim vlCodigo As Integer
Dim vlTarefa As Integer
Dim vlNome As String
Dim vlUpload As Byte()
Property Codigo()
Get
Return vlCodigo
End Get
Set(ByVal value)
vlCodigo = value
End Set
End Property
Property Tarefa()
Get
Return vlTarefa
End Get
Set(ByVal value)
vlTarefa = value
End Set
End Property
Property Nome()
Get
Return vlNome
End Get
Set(ByVal value)
vlNome = value
End Set
End Property
Property Upload()
Get
Return vlUpload
End Get
Set(ByVal value)
vlUpload = value
End Set
End Property
Public Function AssociaDados(ByVal pLabel As WebControls.Label)
Dim Ds As Data.DataSet
Dim pTeste As String
If vlCodigo > 0 Then pTeste = "Arquivo_Codigo <> " & vlCodigo & " AND " Else pTeste = DBNull.Value.ToString
Try
Ds = Duplicidade(pTeste & _
" Tarefa_Codigo = " & vlTarefa & _
" AND Arquivo_Nome = '" & Trim(vlNome) & "' ")
If Not Ds Is Nothing Then
If Ds.Tables(0).Rows.Count = 0 Then
If vlCodigo = 0 Then Incluir(pLabel) Else Alterar(pLabel)
Else
If Ds.Tables(0).Rows.Count > 0 Then
pLabel.CssClass = "label confirma"
pLabel.Text = "Este registro já foi cadastrado!!!"
End If
End If
Else
If Ds Is Nothing Then
End If
End If
Catch ex As Exception
pLabel.CssClass = "label erro"
pLabel.Text = "Ocorreu um erro ao tentar salvar este registro:<br />" & ex.Message
End Try
End Function
Public Function Incluir(ByVal pLabel As WebControls.Label)
Dim conexaoMySQL As MySqlConnection
Dim Cm As New MySqlCommand
Dim SQL As New System.Text.StringBuilder
Dim Conexao As String
Conexao = ConfigurationManager.AppSettings("cStrConexao")
conexaoMySQL = New MySqlConnection(Conexao)
Try
SQL.Append(" INSERT INTO d003_arquivos (Tarefa_Codigo, Arquivo_Nome, Arquivo_Upload) ")
SQL.Append(" VALUES (?Tarefa, ?Nome, ?Upload) ")
With Cm.Parameters
.Add(New MySqlParameter("?Tarefa", vlTarefa))
.Add(New MySqlParameter("?Nome", Trim(vlNome)))
.Add(New MySqlParameter("?Upload", vlUpload))
End With
Cm.Connection = conexaoMySQL
Cm.CommandText = SQL.ToString
conexaoMySQL.Open()
Cm.ExecuteNonQuery()
conexaoMySQL.Close()
pLabel.CssClass = "label confirma"
pLabel.Text = "Registro cadastrado com sucesso!!!"
Catch ex As Exception
pLabel.CssClass = "label erro"
pLabel.Text = "Ocorreu um erro ao tentar salvar este registro:<br />" & ex.Message
End Try
End Function
Public Function Alterar(ByVal pLabel As WebControls.Label)
Dim conexaoMySQL As MySqlConnection
Dim Cm As New MySqlCommand
Dim SQL As New System.Text.StringBuilder
Dim Conexao As String
Conexao = ConfigurationManager.AppSettings("cStrConexao")
conexaoMySQL = New MySqlConnection(Conexao)
Try
SQL.Append(" UPDATE d003_arquivos SET ")
SQL.Append(" Tarefa_Codigo = ?Tarefa, ")
SQL.Append(" Arquivo_Nome = ?Nome, ")
SQL.Append(" Arquivo_Upload = ?Upload ")
SQL.Append(" WHERE Arquivo_Codigo = ?Codigo ")
With Cm.Parameters
.Add(New MySqlParameter("?Tarefa", vlTarefa))
.Add(New MySqlParameter("?Nome", Trim(vlNome)))
.Add(New MySqlParameter("?Upload", vlUpload))
.Add(New MySqlParameter("?Codigo", vlCodigo))
End With
Cm.Connection = conexaoMySQL
Cm.CommandText = SQL.ToString
conexaoMySQL.Open()
Cm.ExecuteNonQuery()
conexaoMySQL.Close()
pLabel.CssClass = "label confirma"
pLabel.Text = "Registro alterado com sucesso!!!"
Catch ex As Exception
pLabel.CssClass = "label erro"
pLabel.Text = "Ocorreu um erro ao tentar salvar este registro:<br />" & ex.Message
End Try
End Function
Public Function Excluir()
Dim conexaoMySQL As MySqlConnection
Dim Cm As New MySqlCommand
Dim SQL As New System.Text.StringBuilder
Dim Conexao As String
Conexao = ConfigurationManager.AppSettings("cStrConexao")
conexaoMySQL = New MySqlConnection(Conexao)
SQL.Append(" DELETE FROM d003_arquivos ")
SQL.Append(" WHERE Arquivo_Codigo = " & vlCodigo)
Cm.Connection = conexaoMySQL
Cm.CommandText = SQL.ToString
conexaoMySQL.Open()
Cm.ExecuteNonQuery()
conexaoMySQL.Close()
End Function
Public Function Consultar(ByVal pParametro As String, ByVal pOrdem As String) As Data.DataSet
Dim Cm As New MySqlCommand
Dim SQL As New System.Text.StringBuilder
Dim Conexao As New MySqlConnection(strConexao)
Dim Ds As Data.DataSet
Dim Da As MySqlDataAdapter
SQL.Append(" SELECT A.Arquivo_Codigo, A.Tarefa_Codigo, A.Arquivo_Nome, A.Arquivo_Upload ")
SQL.Append(" FROM d003_arquivos A ")
If Trim(pParametro) <> "" Then SQL.Append(" WHERE " & pParametro & "")
If Trim(pOrdem) <> DBNull.Value.ToString Then SQL.Append(" ORDER BY " & pOrdem & " ") Else SQL.Append(" ORDER BY A.Tarefa_Codigo, A.Arquivo_Nome ")
Da = New MySqlDataAdapter(SQL.ToString, Conexao)
Conexao.Open()
Ds = New Data.DataSet
Da.Fill(Ds)
Conexao.Close()
Return Ds
End Function
Public Function Duplicidade(ByVal pParametro As String) As Data.DataSet
Dim conexaoMySQL As MySqlConnection
Dim Da As MySqlDataAdapter
Dim Ds As Data.DataSet
Dim SQL As New System.Text.StringBuilder
Dim Conexao As String
Conexao = ConfigurationManager.AppSettings("cStrConexao")
conexaoMySQL = New MySqlConnection(Conexao)
SQL.Append(" SELECT Arquivo_Codigo, Tarefa_Codigo, Arquivo_Nome ")
SQL.Append(" FROM d003_arquivos ")
If Trim(pParametro) <> "" Then SQL.Append(" WHERE " & pParametro & "")
Da = New MySqlDataAdapter(SQL.ToString, conexaoMySQL)
conexaoMySQL.Open()
Ds = New Data.DataSet
Da.Fill(Ds)
conexaoMySQL.Close()
Return Ds
End Function
End Class
End Namespace

 

 

e no código do botão

 

 

 

 

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim Gi As DataGridItem
Dim pContador, pArquivo, pMensagem1, pMensagem2 As WebControls.Label
Dim pUpload As WebControls.FileUpload
Dim Upload As Byte()
Dim I As Integer
I = 0
For Each Gi In DataGrid1.Items
pContador = Gi.Cells(0).FindControl("gLbContador")
pUpload = Gi.Cells(1).FindControl("gFileUpload1")
pArquivo = Gi.Cells(2).FindControl("gLbArquivo")
pMensagem1 = Gi.Cells(2).FindControl("gLbMensagem1")
pMensagem2 = Gi.Cells(2).FindControl("gLbMensagem2")
With DataGrid1
Upload = pUpload.FileBytes
With Arquivo
.Codigo = 0
.Tarefa = LbCodigo.Text
.Nome = pUpload.FileName
.Upload = Upload
End With
If pUpload.FileName <> "" Then Arquivo.Incluir(pMensagem2)
End With
Next
End Sub

 

Agora consegui salvar arquivos pdf, mas quando tentei salvar arquivo do tipo txt apareceu a mensagem:

 

 

 

Packets larger than max_allowed_packet are not allowed.

 

Outra coisa, usando UpdatePanel ele não executa, mesmo que atribua as triggers, tenho que removê-lo para funcionar corretamente, pois os dados do UploadFile ficam nulos.



Desculpe, o arquivo txt deu certo, o que não deu certo foi o arquivo sql.

Agora, só falta resolver dois problemas:

 

1 - Executar utilizando UpdatePanel;

2 - Fazer o download destes arquivos, mas este estou pesquisando

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse erro é porque o campo tem tamanho menor do que o permitido, tente usar o Image.

 

O update panel é realmente uma coisa complicada, ele não funciona direito e eu já tive estes problemas com ele, porém não sei como resolvê-los, vou ficar te devendo essa...

 

Para download é muito simples:

 Dim nomearquivo As String = "Nome do arquivo"
            Dim arquivo As Byte() = "Seus Bytes()"
            Response.AddHeader("content-disposition", String.Format("attachment;filename={0}", nomearquivo))
            Response.AddHeader("Content-Length", arquivo.Length.ToString())
            Response.Clear()
            Response.ContentType = "Tipo do arquivo"
            Response.BinaryWrite(arquivo)
            Response.End()

O tipo do arquivo pode ser obtido assim que você faz o upload, utilizando a sintaxe [inline]fileupload1.PostedFile.ContentType[/inline] ou algo do gênero.

Compartilhar este post


Link para o post
Compartilhar em outros sites

KhaosDoctor,

 

Cara, desculpa não ter voltado aqui para agradecer-lhe pela grande ajuda, mas é que só pude testar esse recurso um tempo depois.

Bem, eu testei hoje e apliquei e ficou show!!!

 

Mais uma vez, muito obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.