Jump to content

Violação de concorrência: UpdateCommand


AFrei

Recommended Posts

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

Link to comment
Share on other 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?

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Link to comment
Share on other 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
Link to comment
Share on other 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.

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Link to comment
Share on other 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

"Nós somos o que fazemos repetidamente, a excelência não é um feito, e sim, um hábito."
Não respondo a questões por PM que possam ser colocadas no fórum!

Link to comment
Share on other 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 😉

Link to comment
Share on other 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

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.