Ir para conteúdo

Arquivado

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

bruno_pascal

Problema ao deletar um registro

Recommended Posts

Bom dia a todos do fórum.

 

Estou utilizando um outro código teoricamente simples para cadastrar contatos, porém quando resolvo adicionar um contato e tento apagá-lo em seguida , então ocorre um erro de "Violation Concurrency :DeleteCommand afetou 0 dos registros 1 esperados". Talvez deva estar faltando algo no código e gostaria de aproveitá-lo.

 

 

Se alguém puder ajudar ficarei muito grato.

 

O código segue abaixo :

 

Imports MySql.Data.MySqlClient

Public Class frmCadastro

    Private connection As New MySqlConnection("Server=localhost;Database=cadastro;uid=root;pwd=;")
    Private adapter As New MySqlDataAdapter("Select  id,nome,endereco,telefone,celular,email,obs from contatos", connection)
    Private builder As New MySqlCommandBuilder(Me.adapter)
    Private table As New DataTable
    Private BindingSource1 As New BindingSource

    Private Sub frmCadastro_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        CarregarDados()
    End Sub

    Private Sub btnProximo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProximo.Click
        Me.BindingSource1.MoveNext()
        ContagemRegistros()
    End Sub

    Private Sub btnAnterior_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAnterior.Click
        Me.BindingSource1.MovePrevious()
        ContagemRegistros()
    End Sub

    Private Sub btnPrimeiro_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrimeiro.Click
        Me.BindingSource1.MoveFirst()
        ContagemRegistros()
    End Sub

    Private Sub btnUltimo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUltimo.Click
        Me.BindingSource1.MoveLast()
        ContagemRegistros()
    End Sub

    Private Sub btnNovo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNovo.Click

        Me.CaixasdeTexto(False)
        DesabilitaNavegacao()
        HabilitaEdicao()
        Me.BindingSource1.AddNew()
        txtNome.Focus()

    End Sub

    Private Sub btnSalvar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalvar.Click

        If txtNome.Text <> "" Then

            Me.BindingSource1.EndEdit()
            Me.adapter.Update(Me.table)
            Me.table.AcceptChanges()
            MessageBox.Show("Contato salvo com sucesso!", "Salvou contato", MessageBoxButtons.OK, MessageBoxIcon.Information)

            Me.CaixasdeTexto(True)
            DesabilitaEdicao()
            HabilitaNavegacao()
            ContagemRegistros()
            
        Else
            MessageBox.Show("Insira pelo menos um nome para salvar um contato!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Return
        End If

    End Sub

    Private Sub btnCancelar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancelar.Click

        Me.BindingSource1.CancelEdit()
        Me.CaixasdeTexto(True)
        DesabilitaEdicao()
        HabilitaNavegacao()

    End Sub

    Private Sub btnExcluir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExcluir.Click

           If Me.BindingSource1.Count > 0 Then

            Dim resposta As DialogResult
            resposta = MessageBox.Show("Deseja realmente excluir este contato?", "Aviso para exclusão", MessageBoxButtons.YesNo, MessageBoxIcon.Question)

            If resposta = Windows.Forms.DialogResult.Yes Then

                Me.BindingSource1.RemoveCurrent()
                Me.adapter.Update(Me.table)
                ContagemRegistros()
            
                Else
                Return
            End If

        Else
            MessageBox.Show("Não existem mais contatos a serem excluídos", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Return
        End If
       
        End Sub

    Private Sub btnSair_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSair.Click

        Dim resposta As DialogResult

        resposta = MessageBox.Show("Deseja realmente sair do programa?", "Sair", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
        If resposta = Windows.Forms.DialogResult.Yes Then
            Me.Dispose()
        Else
            Return
        End If

    End Sub

    Private Sub CaixasdeTexto(ByVal valor As Boolean)

        txtNome.ReadOnly = valor
        txtEndereco.ReadOnly = valor
        txtTelefone.ReadOnly = valor
        txtCelular.ReadOnly = valor
        txtEmail.ReadOnly = valor
        txtObs.ReadOnly = valor

    End Sub

    Private Sub btnEditar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEditar.Click

        Me.CaixasdeTexto(False)
        HabilitaEdicao()
        DesabilitaNavegacao()

    End Sub

    Private Sub HabilitaEdicao()

        btnNovo.Enabled = False
        btnSalvar.Enabled = True
        btnCancelar.Enabled = True
        btnExcluir.Enabled = False
        btnPesquisar.Enabled = False
        btnEditar.Enabled = False

    End Sub

    Private Sub DesabilitaEdicao()

        btnNovo.Enabled = True
        btnSalvar.Enabled = False
        btnCancelar.Enabled = False
        btnExcluir.Enabled = True
        btnPesquisar.Enabled = True
        btnEditar.Enabled = True

    End Sub

    Private Sub DesabilitaNavegacao()
        gbNavegacao.Enabled = False
    End Sub

    Private Sub HabilitaNavegacao()
        gbNavegacao.Enabled = True
    End Sub

    Private Sub ContagemRegistros()
        lblRegistros.Text = Me.BindingSource1.Position + 1 & "  registro(s)  de  " & Me.BindingSource1.Count
    End Sub

    Private Sub CarregarDados()
        Me.CaixasdeTexto(True)
        DesabilitaEdicao()


        Me.adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey
        Me.adapter.Fill(table)

        Me.BindingSource1.DataSource = Me.table

        Me.txtID.DataBindings.Add("Text", Me.BindingSource1, "ID")
        Me.txtNome.DataBindings.Add("Text", Me.BindingSource1, "Nome")
        Me.txtEndereco.DataBindings.Add("Text", Me.BindingSource1, "Endereco")
        Me.txtTelefone.DataBindings.Add("Text", Me.BindingSource1, "Telefone")
        Me.txtCelular.DataBindings.Add("Text", Me.BindingSource1, "Celular")
        Me.txtEmail.DataBindings.Add("Text", Me.BindingSource1, "Email")
        Me.txtObs.DataBindings.Add("Text", Me.BindingSource1, "Obs")

        ContagemRegistros()
    End Sub

End Class

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pela atenção. Havia criado sim, uma chave primária/auto-incremento para o campo ID no banco de dados o qual aparece numa caixa de texto no formulário.

 

O erro aparece em tempo de execução do procedimento, marcando com uma linha amarela o seguinte código do botão Excluir:


Me.adapter.Update(Me.table)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você não pode deletar o item pai de uma tabela que tem chaves estrangeiras referenciadas em outras tabelas sem antes deletar todos os registros atrelados a ela primeiro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem apenas uma tabela com ID(Chave Primária/Auto-incremento) , além dos campos nome, endereço, entre outros . Não possui chave estrangeira não. Chave estrangeira existiria se houvessem mais tabelas , conforme você supôs. Mas no caso só existe uma tabela com todos os campos já mencionados anteriormente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faça um teste de mesa, tente executar direto pela linha de comando do SQL o comando Delete, se funcionar é porque você vai ter que usar um método mais "agressivo" no seu código.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acredito que como não funcionou com o programa , que deva estar faltando algum código complementar mesmo, pois não é comum esse tipo de erro no banco de dados. Como seria esse método mais "agressivo" no código?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, os métodos mais agressivos são os que, na minha opinião, são bem melhores, porque dão ao programador a possibilidade de controle total do código ao invés de usar o código pronto do .NET.

 

Para isto você teria que, sempre que for fazer uma query no banco, criar um objeto connection, um objeto command e um objeto de retorno (caso sua query retorne alguma coisa), se a sua query não retornar nada então você não precisa do objeto de retorno, mas de qualquer maneira a conexão e o comando são necessários.

 

Você pode defini-los uma única vez no topo, porém o comando sempre irá mudar, você pode usar a sintaxe [inline]SeuComando.CommandText = "Query SQL"[/inline]

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas no caso eu teria de fazer essa query para todos os comandos ( Inserir, Alterar e Excluir) ?? . Só não entendi bem o termo que você usou sobre retorno. Se eu tivesse que usar essa query em relação aos 3 comandos anteriores, retornaria algo ou teria de usar somente os objetos conexão e comando? Pra fazer a pesquisa , teria de retornar não é? Seria isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, se você faz um insert, update ou delete então você não precisa deste objeto de retorno porque ele não retorna nenhum resultado, agora se você realiza um select você vai precisar de um objeto dataTable ou dataReader para pegar o que foi retornado e conseguir ler.

 

Basicamente você pode criar um de cada objeto no alto do escopo do seu sistema e usá-los apenas alterando os comandos, mas você vai precisar escrever um comando para cada ação que você vai executar, portanto é viável fazer um método de CRUD que vai permitir a inserção deste comando mais facilmente.

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.