Ir para conteúdo

Arquivado

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

bruno_pascal

Violação de concorrência: DeleteCommand

Recommended Posts

Oi Boa tarde a todos deste fórum

 

Tenho um projeto parado de agenda no visual basic 2008 , onde é feito um cadastro com dados de campo (nome, endereço, telefone, celular, e-mail e observação) na base de dados mysql.

 

O problema é o seguinte : Quando eu adiciono um contato e logo em seguida eu tento apagá-lo, aparece um erro tal como : DBCuncurrencyException(Violação de concorrência: DeleteCommand afetou 0 dos registros 1 esperados.)

 

Alguém deste fórum poderia me ajudar dando uma solução para este problema, indicando o que deve ser feito? Qual modificação devo fazer no código para que este erro não apareça mais ?

 

Se alguém souber e puder me ajudar ,ficarei muito grato.

 

Desde já agradeço,

Obrigado a todos.

 

 

Imports MySql.Data.MySqlClient

Public Class frmCadastro
    Inherits System.Windows.Forms.Form

    Private oDataAdapter As MySqlDataAdapter
    Private oDataset As DataSet
    Private iPosLinhaAtual As Integer
    Public marcador As Integer



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

        Dim oConexao As MySqlConnection
        oConexao = New MySqlConnection
        oConexao.ConnectionString = "Server=localhost;Database=cadastro;uid =root;pwd=;"

        Me.oDataAdapter = New MySqlDataAdapter("Select * from contatos", oConexao)
        Dim oCommBuild As MySqlCommandBuilder = New MySqlCommandBuilder(oDataAdapter)
        Me.oDataset = New DataSet
        oConexao.Open()
        Me.oDataAdapter.Fill(oDataset, "contatos")
        oConexao.Close()

        Me.iPosLinhaAtual = 0
        Me.marcador = 0

        Me.CarregarDados()
        Me.CaixasdeTexto(True)


    End Sub

    Private Sub CarregarDados()

        Dim oDataRow As DataRow
        oDataRow = Me.oDataset.Tables("contatos").Rows(Me.iPosLinhaAtual)

        Try

            Me.txtID.Text = oDataRow("ID").ToString
            Me.txtNome.Text = oDataRow("Nome").ToString
            Me.txtEndereco.Text = oDataRow("Endereco").ToString
            Me.txtTelefone.Text = oDataRow("Telefone").ToString
            Me.txtCelular.Text = oDataRow("Celular").ToString
            Me.txtEmail.Text = oDataRow("Email").ToString
            Me.txtObs.Text = oDataRow("Obs").ToString

        Catch ex As Exception
            MessageBox.Show("Erro ao carregar dados", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try

        Me.lblRegistro.Text = "Registro:  " & _
        Me.iPosLinhaAtual + 1 & " de " & _
        Me.oDataset.Tables("contatos").Rows.Count

    End Sub

    Private Sub btnFechar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFechar.Click
        Me.Dispose()
    End Sub

    Private Sub btnProximo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProximo.Click

        If Me.iPosLinhaAtual = (Me.oDataset.Tables("contatos").Rows.Count - 1) Then
            Beep()
            Return

        Else
            Me.iPosLinhaAtual += 1
            Me.CarregarDados()

        End If
    End Sub

    Private Sub btnAnterior_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAnterior.Click

        If Me.iPosLinhaAtual = 0 Then
            Beep()
            Return
        Else
            Me.iPosLinhaAtual -= 1
            Me.CarregarDados()
        End If
    End Sub

    Private Sub btnPrimeiro_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrimeiro.Click

        Me.iPosLinhaAtual = 0
        Me.CarregarDados()
    End Sub

    Private Sub btnUltimo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUltimo.Click

        Me.iPosLinhaAtual = (Me.oDataset.Tables("contatos").Rows.Count - 1)
        Me.CarregarDados()
    End Sub

    Private Sub LimparCampos()

        txtNome.Clear()
        txtEndereco.Clear()
        txtTelefone.Clear()
        txtCelular.Clear()
        txtEmail.Clear()
        txtObs.Clear()
        txtNome.Focus()
    End Sub

    Private Sub btnNovo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNovo.Click
        Me.marcador = 1
        LimparCampos()
        Me.CaixasdeTexto(False)
        Me.Navegacao(False)
    End Sub

  Private Sub btnModificar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnModificar.Click
        Me.marcador = 2
        Me.CaixasdeTexto(False)
        Me.Navegacao(False)

    End Sub

    Private Sub btnApagar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnApagar.Click

        If marcador = 0 Then
            Dim resposta As DialogResult
            resposta = MessageBox.Show("Deseja realmente excluir este contato?", "Processo de exclusão", MessageBoxButtons.YesNo, MessageBoxIcon.Question)

            If resposta = Windows.Forms.DialogResult.Yes Then

                Dim oDataRow As DataRow

                oDataRow = Me.oDataset.Tables("contatos").Rows(Me.iPosLinhaAtual)
                oDataRow.Delete()

                Dim oTabelaApagada As DataTable
                oTabelaApagada = Me.oDataset.Tables("contatos").GetChanges(DataRowState.Deleted)


                Me.oDataAdapter.Update(oTabelaApagada)
                Me.oDataset.Tables("contatos").AcceptChanges()

                MessageBox.Show("Contato excluído com sucesso!", "Exclusão concluída", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Me.marcador = 0
                btnAnterior.PerformClick()


            Else

                Return
            End If
        End If

    End Sub


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

        If marcador = 1 Then
            If txtNome.Text <> "" Then
                Dim oDataRow As DataRow

                oDataRow = Me.oDataset.Tables("contatos").NewRow()

                oDataRow("ID") = Me.txtID.Text
                oDataRow("Nome") = Me.txtNome.Text
                oDataRow("Endereco") = Me.txtEndereco.Text
                oDataRow("Telefone") = Me.txtTelefone.Text.ToString
                oDataRow("Celular") = Me.txtCelular.Text
                oDataRow("Email") = Me.txtEmail.Text
                oDataRow("Obs") = Me.txtObs.Text

                Me.oDataset.Tables("contatos").Rows.Add(oDataRow)
                Me.oDataAdapter.Update(Me.oDataset, "contatos")

                MessageBox.Show("Contato salvo com sucesso!", "Contato adicionado", MessageBoxButtons.OK, MessageBoxIcon.Information)



                Me.CaixasdeTexto(True)
                Me.marcador = 0
                Me.Navegacao(True)
                Me.btnUltimo.PerformClick()
                CarregarDados()



            Else
                MessageBox.Show("Digite ao menos um nome para salvar um contato!", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Stop)
            End If

        ElseIf marcador = 2 Then

            Dim oDataRow As DataRow
            oDataRow = Me.oDataset.Tables("contatos").Rows(Me.iPosLinhaAtual)

            oDataRow("ID") = Me.txtID.Text
            oDataRow("Nome") = Me.txtNome.Text
            oDataRow("Endereco") = Me.txtEndereco.Text
            oDataRow("Telefone") = Me.txtTelefone.Text
            oDataRow("Celular") = Me.txtCelular.Text
            oDataRow("Email") = Me.txtEmail.Text
            oDataRow("Obs") = Me.txtObs.Text

            Me.oDataAdapter.Update(Me.oDataset, "contatos")

            MessageBox.Show("Contato alterado com sucesso!", "Contato alterado", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Me.CaixasdeTexto(True)
            Me.Navegacao(True)
            Me.marcador = 0

        End If

    End Sub

    Private Sub btnCancelar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancelar.Click
        CarregarDados()
        CaixasdeTexto(True)
        Me.Navegacao(True)
        Me.marcador = 0
    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 Navegacao(ByVal valor As Boolean)

        btnPrimeiro.Enabled = valor
        btnAnterior.Enabled = valor
        btnProximo.Enabled = valor
        btnUltimo.Enabled = valor

    End Sub

    Private Sub btnPesquisar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPesquisar.Click
        frmPesquisar.Show()
    End Sub
End Class

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado por tentar me ajudar. Mas existe apenas uma tabela no banco de dados mysql,chamada contatos. Nela existem os campos : ID(auto-incremento/chave primária) , Nome, Endereço, Telefone, entre outros campos. Só que está acontecendo o seguinte : Assim que eu executo o programa, o formulário se abre, daí eu clico em Novo ,adiciono um contato qualquer e depois clico em Salvar. Então vou no banco de dados e aparece o contato recém-adicionado. Então logo depois , eu resolvo excluir esse mesmo contato que acabei de salvar. Então esse erro aparece : DBConcorrency Exception(Violação de concorrência: DeleteCommand afetou 0 dos registros 1 esperados) e eu não tenho idéia de como resolver isso, pois não tenho experiência com banco de dados mysql, assim como estou aprendendo visual basic. Porém não sei se é algum trecho de código que está faltando...

 

Se puder testar esse código na máquina e puder dar uma solução para o problema indicando o que devo fazer, ficarei muito agradecido, pois estou com esse projeto parado já há algum tempo e não sei o que fazer. O resto do programa está funcionando direitinho.

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso é erro no seu comando SQL também, só que você está usando um dataset fica difícil de ver qual é o comando utilizado. Aconselho o uso de MySQLCommand e Connection

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas assim, é normal isso acontecer? Pois a princípio o código está "enxuto". Achava que existisse algum procedimento ou algo para resolver isso. Sinceramente, não sei o porquê disso estar acontecendo. Só na hora de excluir na forma que te disse que isso aparece. Fiquei até achando que estivesse faltando algum comando para atualizar a tabela , tipo "refresh".

 

Porém , se tivesse que usar o MYSQLCommand iria alterar radicalmente o código , não ? Poderia me dar uma idéia por código de como ficaria, por favor ?

 

 

Obg.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na verdade cara, não adianta ter um código enxuto que não funciona... As vezes é mais fácil exibir um pouco mais internamente pra poder saber exatamente o que você está fazendo.

 

Usar o MySQLCommand implicaria na alteração do bloco:

 

Dim oDataRow As DataRow
                oDataRow = Me.oDataset.Tables("contatos").Rows(Me.iPosLinhaAtual)
                oDataRow.Delete()
                Dim oTabelaApagada As DataTable
                oTabelaApagada = Me.oDataset.Tables("contatos").GetChanges(DataRowState.Deleted)

                Me.oDataAdapter.Update(oTabelaApagada)
                Me.oDataset.Tables("contatos").AcceptChanges()
                MessageBox.Show("Contato excluído com sucesso!", "Exclusão concluída", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Me.marcador = 0
                btnAnterior.PerformClick()

 

Que ficaria mais ou menos:

Dim con as new MySQLConnection("Sua String de conexão")
Dim com as new MySQLCommand("DELETE FROM <tabela> WHERE <id> = <numero>",con);


con.Open()


com.ExecuteNonQuery()


con.Close()


MessageBox.Show("Contato excluído com sucesso!", "Exclusão concluída", MessageBoxButtons.OK, MessageBoxIcon.Information)
 

Me.marcador = 0
                

btnAnterior.PerformClick()

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim concordo contigo , mas não que o código inteiro esteja inadequado. Só não funciona nessa particularidade que te disse que por sinal o torna inviável , já que programas não podem conter erros durante sua execução. Mas vou seguir sua instrução . Eu teria que então que mudar também o código com relação ao botão salvar e alterar também não é? Teria somente de mudar a instrução SQL mas o estilo é o mesmo , é isso? Ou teria de usar algum parâmetro neste caso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não é necessário mudar os outros dois, nesse exemplo você dá um injection direto no banco, não vai mexer nada com sua aplicação.

 

Você precisaria substituir as queries que eu escrevi ali pelas suas, mas fora isso não tem nada de mais.

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.