AFrei Posted September 23, 2009 at 09:21 AM Report Share #288258 Posted September 23, 2009 at 09:21 AM 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 More sharing options...
ribeiro55 Posted September 23, 2009 at 12:41 PM Report Share #288276 Posted September 23, 2009 at 12:41 PM 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 More sharing options...
AFrei Posted September 23, 2009 at 01:48 PM Author Report Share #288292 Posted September 23, 2009 at 01:48 PM 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 More sharing options...
ribeiro55 Posted September 23, 2009 at 03:02 PM Report Share #288309 Posted September 23, 2009 at 03:02 PM 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 More sharing options...
anolsi Posted September 23, 2009 at 03:09 PM Report Share #288311 Posted September 23, 2009 at 03:09 PM 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 More sharing options...
ribeiro55 Posted September 23, 2009 at 03:35 PM Report Share #288316 Posted September 23, 2009 at 03:35 PM Sim. Esse método ainda é mais limpinho. 😉 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 More sharing options...
AFrei Posted September 23, 2009 at 04:04 PM Author Report Share #288325 Posted September 23, 2009 at 04:04 PM 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 More sharing options...
AFrei Posted September 23, 2009 at 04:05 PM Author Report Share #288326 Posted September 23, 2009 at 04:05 PM Anolsi, ainda não tinha visto o teu post...vou tentar 😉 Link to comment Share on other sites More sharing options...
AFrei Posted September 23, 2009 at 04:13 PM Author Report Share #288327 Posted September 23, 2009 at 04:13 PM 😉 o mesmo... Vou tentar mudar o datasource ou qualquer coisa desse genero que feche a ligaçao á BD e voltar a ligar... Link to comment Share on other sites More sharing options...
AFrei Posted September 29, 2009 at 09:11 AM Author Report Share #289136 Posted September 29, 2009 at 09:11 AM 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 More sharing options...
AFrei Posted September 29, 2009 at 01:08 PM Author Report Share #289162 Posted September 29, 2009 at 01:08 PM Criei o projecto de novo com o mesmo código e o erro desapareceu...que estranho.. Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now