Ilano 0 Denunciar post Postado Maio 6, 2013 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
KhaosDoctor 242 Denunciar post Postado Maio 7, 2013 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
Ilano 0 Denunciar post Postado Maio 7, 2013 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
KhaosDoctor 242 Denunciar post Postado Maio 7, 2013 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
Ilano 0 Denunciar post Postado Maio 7, 2013 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
KhaosDoctor 242 Denunciar post Postado Maio 8, 2013 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
Ilano 0 Denunciar post Postado Maio 18, 2013 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