Mensagem de erro quando você atualizar um banco de dados, usando um procedimento armazenado: "System.Data.DBConcurrencyException"

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 310375
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Este artigo se refere aos seguintes namespaces Microsoft .NET Framework Class Library:
  • System.Data.OLEDB
  • System.Data.SqlClient
Sintomas
Quando você usa um objeto de DataAdapter para gravar alterações de volta para um banco de dados por meio de um procedimento armazenado, você receberá a seguinte mensagem de erro:
Ocorreu uma exceção sem tratamento do tipo 'System.Data.DBConcurrencyException' em system.data.dll

Obter informações adicionais: violação de concorrência: UpdateCommand afetou 0 registro.
Se os dados não são atualizados corretamente, você deve receber uma exceção DataConcurrencyException em vez da mensagem de erro mencionadas anteriormente.
Causa
Esse problema pode ocorrer se o procedimento armazenado for executado SET NOCOUNT ON instrução.
Resolução
Para receber uma exceção quando os dados não estão atualizados corretamente, você deve adicionar explicitamente a instrução SET NOCOUNT OFF para o procedimento armazenado.
Situação
Esse comportamento é por design.
Mais Informações
Para determinar se existe um problema de simultaneidade, o DataAdapter depende a propriedade RecordsAffected que o procedimento armazenado retorna. Se você definir NOCOUNT como ON, o procedimento armazenado não retorna o número correto de registros afetados e o DataAdapter não pode determinar que ocorreu um erro.

Passos para reproduzir o problema

Esse código de exemplo usa tabela Employees do banco de dados Northwind incluído no Microsoft SQL Server de.
  1. Cole as instruções a seguir no SQL Query Analyzer ferramenta ou o utilitário ISQL:
        CREATE PROCEDURE UpdateEmployee    AS    SET NOCOUNT ON    UPDATE Employees SET FirstName = 'Jay'  WHERE EmployeeID = 1000    SELECT * FROM employees    GO					
  2. Abra o Microsoft Visual Studio .NET.
  3. Criar um novo Visual Basic Windows Application projeto.
  4. Verifique se seu projeto contém uma referência ao namespace System.Data e adicione uma referência a este espaço para nome se não.
  5. Coloque um controle de botão em Form1. Altere a propriedade nome do botão para btnTest e altere a propriedade Text para teste .
  6. Use a declaração Imports no sistema , System.Data e System.Data.SqlClient namespaces para que não é necessário para qualificar declarações esses namespaces posteriormente no seu código. Adicione o seguinte código à seção "General Declarations" do Form1:
    Imports SystemImports System.Data.OleDbImports System.Data.SqlClient					
  7. Adicione o seguinte código após a região "Windows Form Designer gerou código" na janela código:
    Observação Você deve alterar o ID de usuário < nome do usuário > e < senha de alta segurança > senha para os valores corretos. Certifique-se que IdD usuário tenha as permissões apropriadas para executar essas operações no banco de dados.
        Private Sub btnTest_Click(ByVal sender As System.Object, _    ByVal e As System.EventArgs) Handles btnTest.Click        Dim myConnString As String = _                "User ID=<username>;Password=<strong password>;Initial Catalog=Northwind;Data Source=myServer"        Dim myQuery As String = _                "SELECT * FROM Employees WHERE employeeid = 1"        Dim cn As New SqlConnection(myConnString)        cn.Open()        Dim da As New SqlDataAdapter()        da.SelectCommand = New SqlCommand(myQuery, cn)        da.UpdateCommand = New SqlCommand()        With da.UpdateCommand            .Connection = cn            .CommandType = CommandType.StoredProcedure            .CommandText = "UpdateEmployee"        End With        Dim ds As New DataSet()        da.Fill(ds, "EmployeeTable")        ds.Tables("EmployeeTable").Rows(0)("FirstName") = "Jack"        Dim iRowsAffected As Integer        iRowsAffected = da.Update(ds, "EmployeeTable")        MessageBox.Show(iRowsAffected.ToString)        cn.Close()    End Sub					
  8. Modificar a seqüência de conexão ( myConnString ) conforme apropriado para seu ambiente.
  9. Salve seu projeto. No menu Debug , clique em Iniciar para executar seu projeto.
  10. Clique em Test . Observe que a exceção não é gerada mesmo se o procedimento armazenado tenta atualizar um registro que não está presente.
  11. Adicione a instrução SET NOCOUNT OFF para o procedimento armazenado e clique em Testar novamente. Observe que a exceção DataConcurrencyException é gerada conforme o esperado.
Referências
Para obter mais informações sobre objetos ADO.NET e a sintaxe, consulte o seguinte Microsoft .NET Framework Software Development Kit (SDK) documentação: Para obter informações adicionais sobre como atualizar um banco de dados do SQL Server, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
308055COMO: Atualizar um banco de dados SQL Server usando o objeto SqlDataAdapter no Visual Basic .NET

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 310375 - Última Revisão: 12/07/2015 08:00:28 - Revisão: 2.3

Microsoft ADO.NET (included with the .NET Framework), Microsoft Visual Basic .NET 2002 Standard Edition

  • kbnosurvey kbarchive kbmt kbprb kbsqlclient kbsystemdata KB310375 KbMtpt
Comentários
ERROR: at System.Diagnostics.Process.Kill() at Microsoft.Support.SEOInfrastructureService.PhantomJS.PhantomJSRunner.WaitForExit(Process process, Int32 waitTime, StringBuilder dataBuilder, Boolean isTotalProcessTimeout)