Escolar Documentos
Profissional Documentos
Cultura Documentos
NET
Concorrência de dados é um dos assuntos que mais são discutidos quando trabalhamos Download
com dados desconectados, e com o advento do ADO.NET, se tornou crucial para o Fontes da aplicação exemplo
desenvolvedor saber como lidar com essa situação. Veremos nesse artigo, algumas 108 KB
alternativas para tratar esse problema de forma segura e ao mesmo tempo elegante do
ponto de vista da interação com o usuário.
O que acontece se na hora que você tentar aplicar a sua alteração no banco de dados, e alguém já tenha modificado esse
mesmo registro? Tecnicamente falando, você tem um conflito de dados. Como tratar esse conflito é estritamente um
problema específico de cada aplicação, que pode ser bem resumido em três opções: First-win (A primeira alteração é que
prevalece), Last-win (A última alteração é que prevalece) e Ask-the-user (O usuário decide). Vejamos cada uma em detalhes,
lembrando que a abordagem que daremos aqui é a Optimistic Concurrency, a única que é aceita pelo ADO.NET.
First-win: O conflito é resolvido silenciosamente e automaticamente removendo a última alteração. Para implementar esse
método, você simplesmente define a propriedade ContinueUpdateError do DataAdapter como True. Sendo assim, nenhuma
exceção será disparada quando ocorrer esse tipo de situação. A informação sobre a exceção de cada linha que a causou é
armazenadas na propriedade RowError enquanto o processo de atualização continua a ocorrer para as demais linhas.
Last-win: Suas alterações são aplicadas independentes do status da linha. Para implementar esse modelo, você deve
simplesmente se assegurar que o seu comando SQL não seja muito restritivo, ou seja, se você criar um comando SQL que
atualize ou apague uma linha, pesquisando pela sua chave primária, nenhum conflito existirá.
Ask-the-user: Você pode dar a liberdade para o usuário escolher o que fazer. Basicamente escolher entre as duas opções
anteriores. Por default um conflito disparará uma DbConcurrencyException, a não ser que você tenha definido a propriedade
ContinueUpdateError como True. A propriedade Row da classe DbConcurrencyException, retorna a referência da linha que
causou a exceção e ter acesso ao valor original e atual da linha para lhe ajudar a dar mais informações para que o usuário
possa fazer sua escolha.
Vamos fazer um exemplo onde poderemos dar ao usuário a opção de escolha de como será o tratamento de concorrência.
Crie um novo projeto Windows Application, chame-o de ADOConcurrency e adicione os controles de acordo com a imagem e
descrição abaixo:
Text ""
Text ""
Text ""
MultiLine True
Text ""
Text <
Text >
Backcolor Info
Text ""
TextAlign MiddleCenter
Text Funcionarios
FormBorderStyle FixedSingle
MaximizeBox False
Text First-win
Text Last-Win
Text Ask-user
Text Update
Vá em Server Explorer e crie uma nova conexão com o banco de dados Northwind. Depois arraste a tabela de Funcionários
para o formulário. Veja que automaticamente será criado um objeto OleDbConnection1 e OleDbDataAdapter1. Agora, clique
com o botão direito em OleDbDataAdapter1 e escolha a opção Generate DataSet. Defina o nome do DataSet como
dsNorthwind e clique em OK. Sua barra de componentes deverá ficar assim:
No evento Load iremos preencher o DataSet, vincular os controles e definir um Event Handler para atulaização do Label com
a posição do registro.
Na rotina de validação, teremos os tratamentos para uma correta navegação entre os registros:
If Position = 1 Then
btnVoltar.Enabled = False
Else
btnVoltar.Enabled = True
End If
'
'Atualiza o label que mostra a posição atual
'
AtualizaLabel()
'
End Sub
Temos também a rotina que atualiza o Label com a informação da posição no registro:
Na rotina que trata o evento do botão Update decidimos a forma como tratar a concorrência de dados de acordo com a
escolha do usuário.
No evento RowUpdated, perguntamos ao usuário o que ele deseja fazer, caso ocorra um erro de concorrência na atualização.
oComm.Parameters.Add("Nome", Me.txtPrimeiroNome.Text)
oComm.Parameters.Add("Sobrenome", Me.txtUltimoNome.Text)
oComm.Parameters.Add("Cargo", Me.txtCargo.Text)
oComm.Parameters.Add("Observações", Me.txtNotas.Text)
oComm.Parameters.Add("CódigoDoFuncionário", Me.lblCodigo.Text)
Catch Ex As Exception
'
Finally
Me.OleDbConnection1.Close()
End Try
End Sub
Início da página
Conclusão:
Vimos um exemplo bem simples, mas que possui a essência do esquema de tratamento de concorrência com ADO.NET. Para
qualquer dúvida ou comentário estarei à disposição. Até a próxima.
Leonardo Bruno
lblima_net@hotmail.com
Currículo: Most Valuable Professional 2004 [Visual Basic .NET]. Trabalha com desenvolvimento de aplicações .NET desde
2001. Ministra cursos sobre a plataforma .NET, é consultor de tecnologia e desenvolvedor de sistemas na RR Consultoria e
Sistemas (Fortaleza - CE). Atualmente está dedicado ao desenvolvimento de um sistema ERP utilizando a plataforma .NET
Início da página
©2006 Microsoft Corporation. Todos os direitos reservados. Nota Legal | Marcas comerciais | Política de Privacidade