Skip Navigation Links
Novas Tecnologias
Ferramentas Adicionais
Ferramentas Adicionais


Dica No :
657
Assunto : ADO.NET
Titulo: Mais cuidados em transações com o adapter

Gostou do texto ? Vote e dê sua opinião! Pontuação atual :

Translate this page now :






Adicione aos Favoritos!
BlogBlogs Rec6 Linkk Ueba Technorati Delicious DiggIt! StumbleUpon



Na dica 611 (http://www.bufaloinfo.com.br/dicas.asp?cod=611) mostramos como realizar uma transação durante a atualização de dados de um adapter.

Porém isso gera consequencias no trabalho com o dataset e precisamos estar muito atentos a isso.

Na dica (link acima) o adapter tem a propriedade continueupdateonerror como false, então ele para no primeiro erro ocorrido, o erro é capturado pelo catch que faz o rollback da transação, desfazendo todas as alterações no banco.

Mas durante este processo o adapter está fazendo bem mais do que simplesmente alterar o banco. Quando alteramos os dados do dataset, este guardou um status para cada linha, informando que a linha encontra-se alterada. Então, quando o adapter grava os dados no banco ele modifica o status das linhas, indicando que foram atualizadas com sucesso.

Mas quando fazemos uma transação, o erro pode acontecer no 3o registro, então as alterações serão desfeitas. Mas neste ponto, o adapter já terá alterado o status do 1o e do 2o registro. Isso faz o dataset acreditar que os dados encontram-se válidos quando na verdade não estão mais válidos. Em uma próxima tentativa de gravação destes registros, os dados do dataset estarão diferentes dos dados do banco e será gerado um erro de violação de concorrência.

Para evitar isso temos que fazer com que, quando estivermos realizando uma transação, o adapter não atualize o status dos registros até que todas as gravações tenham sido realizadas.

Podemos para isso usar o evento rowupdated do adapter. Podemos pedir que não atualize o status das linhas. Mas há um pequeno detalhe na lógica : Se simplesmente fizermos isso o adapter também não marcará as linhas como erradas (já viram as bolinhas vermelhas ao lado de um datagrid?), o que se torna um problema. Então devemos pedir que a atualização de status seja "pulada" apenas para os registros que tiveram sucesso na atualização (sem erros). Os que falharam não terão o status atualizado, de qualquer forma.

Então o código adicional fica assim :

Private Sub OleDbDataAdapter1_RowUpdated(ByVal sender As Object, ByVal e As System.Data.OleDb.OleDbRowUpdatedEventArgs) Handles OleDbDataAdapter1.RowUpdated
If e.StatementType <> StatementType.Select Then
If e.RecordsAffected = 1 Then
e.Status = UpdateStatus.SkipCurrentRow
End If
End If
End Sub


Porém, se a transação funcionar, os registros não terão seu status atualizado. Então podemos adicionar uma instrução a mais, após a realização da transação :

ds1.AcceptChanges

Fazendo o acceptchanges zeramos todos os status das linhas do dataset.


Nome :
E-mail:
Comentarios :
 
 
Os Últimos Comentários
Nenhum comentário foi realizado ainda. Seja o primeiro !
Dicas
Dica do Dia
Receba Dicas Por Email
E-mail :  
 


 (help)
Aceito receber informativos do devASPNet, informações de eventos e treinamentos

Veja Quais Informativos Você Receberá

Pesquisar Dicas
Pesquisar Artigos, Dicas e Noticias

Banco de Dados
Algumas Entrevistas
Links Importantes

Búfalo Informática, Treinamento e Consultoria
R. Alvaro Alvim, 37/920 Centro - Cinelândia - Rio de Janeiro Cep: 20031-010
Tel : (21) 2262-1368 (21) 9240-5134 E-mail : Contato@bufaloinfo.com.br