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

AFrei

Violação de concorrência: UpdateCommand

11 mensagens neste tópico

Boas,

Usando

da.Update(ds, "table1")

Obtenho o seguinte erro quando faço click 2 vezes (e sem ter feito alterações na grid) num botão que actualiza os dados da datagridview na minha base de dados access.

Violação de concorrência: UpdateCommand afectou 0 dos 1 registos esperados.

Ja li http://msdn.microsoft.com/en-us/library/ms171936.aspx mas não percebi nada :) o que tentei não deu certo...

Alguma dica?

Obrigado,

Ana

 

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olá.

Ora aí está uma excepção que eu nunca tinha visto.

Analisando o artigo da Microsoft, Concurrency violation diz nos que estão dois utilizadores a tentar alterar os mesmo dados.

Isso poderá acontecer na tua aplicação? Pois se não puder acontecer, ou se fores o único utilizador a operar sobre essa base de dados, alguma coisa está a correr mal no teu código.

Podes dar mais código à volta do problema ou detalhes sobre o âmbito da operação?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olá, obrigado por tentar ajudar.

Não estão dois utilizadores a tentar alterar os dados. Apenas eu, mas isto acontece quando faço click 2 vezes seguidas no botão que faz o update para a tabela access.

A datagrid tem 3 colunas, ID, Nome e Data.

Ao passar um cartão de banda magnética num leitor, a coluna NOME é preenchida com o nome que se encontra no cartão, de seguida carrega-se no botao e passo para um novo registo e ainda adiciono a data / hora em que o cartão passou no registo anterior.

Isto está a funcionar bem. O que acontece é que se por acidente carregar no botão 2 vezes depois de um utilizador passar um cartao para gravar para a tabela access e ir para o proximo registo, tenho este erro.

Ou seja num datagrid ligado ao access se carrego num botão 2 vezes( só ate com o comando da.update(ds,"table1") no código ), tenho este erro.

Aqui vai o código que tenho mas como disse, até só com o código da.update(ds,"table1")  num botão o erro aparece...

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
Dim row As Integer

        ' Cria automaticamente o comando para permite actualizar o DataSet 
        Dim cb As New OleDbCommandBuilder(da)
        ' Actualiza no DataSet, e na tabela as alterações efectuadas 

        Dim iguais As String
       
        Dim MyDate As Date = Date.Now
     
        For row = 0 To DataGridView1.RowCount - 1

            If IsDBNull(DataGridView1.Item(2, row).Value) Then

                With Me.DataGridView1.Rows(row - 1).DefaultCellStyle.BackColor = Color.Red
                    ' BackColor = Color.Red
                    DataGridView1.Rows(row).DefaultCellStyle.BackColor = Color.IndianRed

                End With

            End If

        Next
      
        If DataGridView1.CurrentRow.Index < DataGridView1.Rows.Count Then

            rc = DataGridView1.Rows.Count - 1

            DataGridView1.CurrentCell = DataGridView1.Item(1, rc)

            SendKeys.Send("{TAB}")

        End If

        DataGridView1.Item(2, DataGridView1.CurrentCell.RowIndex - 1).Value = MyDate

        DataGridView1.CurrentCell = DataGridView1.Item(1, rc)

        da.Update(ds, "table1")

    End Sub

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Penso que isso possa ser resolvido com algo tão simples como um boolean.

Vou te dar um exemplo:

Public Class Form1

    Private Ocupado As Boolean

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If Ocupado = True Then Exit Sub

        Ocupado = True
        'faz qualquer coisa, do género inserir dados da db ;P
        Ocupado = False
    End Sub

End Class

Dessa forma, enquanto se estiver a processar o que quer que seja, não se volta a correr o mesmo código enquanto o Boolean não trocar de estado, o que acontece no final do processamento, quando à partida (e no teu caso) é seguro mexer nos dados de novo.

Um aparte, importante:

Quando adicionares código, selecciona-o todo e utiliza a combobox do lado direito que diz "Inserir Código" para escolher a linguagem. Dessa forma contribuis para a legibilidade do código nos teus posts.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Outra solução, que penso que funcionava, é no inicio da operação bloqueia o botão desabilitando-o, e no fim desbloqueia-o.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        CType(sender, Windows.Forms.Button).Enabled = False
        'Faz as operações necessárias
        CType(sender, Windows.Forms.Button).Enabled = True
End Sub

EDIT: Em vez do CType(sender, Windows.Forms.Button) podes utilizar o nome do teu botão

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mais uma vez obrigado pela ajuda ribeiro55.

A lógica do teu código pareceu-me perfeita mas o que é certo é que continuo com mesmo tipo de erro. Já tentei mais umas condições como se o valor da celula actual for nula ele não vai actualizar ( ou seja se ao segundo clique  não houver dados na celula actual ele nao actualizaria e não teria o erro..mas tenho!

Posso-te enviar o que fiz para algum e-mail para que possas perceber o erro que está a acontecer no meu programa?

ps: Obrigado pela dica..não sou muito experiente em forúms ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

;) o mesmo...

Vou tentar mudar o datasource ou qualquer coisa desse genero que feche a ligaçao á BD e voltar a ligar...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Continuo com o mesmo problema...mas agora o erro que tenho ao carregar duas vezes no botão só com a instrução da.Update(ds, "table1") para actualizar na base de dados access é a seguinte

Update requer um InsertCommand válido quando transferir a colecção DataRow com novas linhas.

Esta descrição do erro aparecia-me sempre a preto e não a conseguia ver, agora já consigo...alguma ideia?

ps

Encontrei aqui algo relacionado com o erro..vou tentar perceber http://support.microsoft.com/default.aspx/kb/310376/pt

Obg. Ana

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Criei o projecto de novo com o mesmo código e o erro desapareceu...que estranho..

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