O objeto CommandBuilder pode recriar um comando que você tentar modificar durante a próxima chamada ao método DataAdapter.Update e suas alterações para o comando podem ser perdidas

Traduções deste artigo Traduções deste artigo
ID do artigo: 310366 - Exibir os produtos aos quais esse artigo se aplica.
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Este artigo se refere ao seguinte namespace Microsoft .NET Framework Class Library:
  • System.Data.SqlClient
Expandir tudo | Recolher tudo

Neste artigo

Sintomas

O objeto CommandBuilder pode recriar um comando que você tentar modificar durante a próxima chamada ao método DataAdapter.Update , e as alterações para o comando podem ser perdidas. Esse problema ocorre nas seguintes circunstâncias:
  • Se você associar um objeto CommandBuilder com um objeto de DataAdapter .
  • Se você usar o método GetInsertCommand , GetUpdateCommand ou GetDeleteCommand do objeto CommandBuilder para explicitamente atribua comandos para o DataAdapter .
  • Se você modificar um dos comandos que gera CommandBuilder .
Ao tentar chamar o método Update de DataAdapter , você receberá a seguinte mensagem de erro:
Ocorreu uma exceção sem tratamento do tipo 'System.Data.SqlClient.SqlException' em system.data.dll

Causa

Esse problema ocorre porque o CommandBuilder altera dinamicamente os comandos que ele gera novamente para o comando original.

Resolução

Use um dos seguintes métodos para resolver esse problema:
  • Não modifique comandos CommandBuilder gera. CommandBuilder não altera objetos de comando que você criar você mesmo.
  • Copie os objetos UpdateCommand , InsertCommand e DeleteCommand para um novo DataAdapter (consulte a seção "Mais informações" para obter um exemplo). Nova variável de DataAdapter deve ter o mesmo escopo ou mais estreita como a variável de DataAdapter antiga.
  • Não use CommandBuilder todo. Escrever seus próprios objetos de comando ou use ferramentas de dados Visual para escrevê-los.

Situação

Esse comportamento é por design.

Mais Informações

Passos para reproduzir o problema

  1. Crie um novo projeto Visual Basic Windows Application. Form1 é adicionado para o projeto por padrão.
  2. Clique duas vezes no formulário e adicione o seguinte código na parte superior da janela código:
    Imports System.Data.SqlClient
    					
  3. Adicione um controle de botão ao Form1.
  4. Clique duas vezes no botão e adicione o seguinte código ao evento Click :
    Dim cn As New SqlConnection()
            Dim custDS As New DataSet()
            Dim da1 As New SqlDataAdapter()
            Dim da2 As New SqlDataAdapter()
            Dim dr As DataRow
            Dim cb As SqlCommandBuilder
    
            cn.ConnectionString = "server=servername;database=northwind;uid=sa;pwd=password;"
            cn.Open()
            da1 = New SqlDataAdapter("select * from Customers", cn)
            cb = New SqlCommandBuilder(da1)
    
            da1.Fill(custDS, "Customers")
    
            'Get the original commands.
    
            da1.InsertCommand = cb.GetInsertCommand
            da1.DeleteCommand = cb.GetDeleteCommand
            da1.UpdateCommand = cb.GetUpdateCommand
    
            Debug.WriteLine("Original command length: " & da1.InsertCommand.CommandText.Length)
    
            'Modify the Insert command.
    
            da1.InsertCommand.CommandText = "select * from customers where customerid=@@identity"
    
            da1.InsertCommand.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord
    
            da2.InsertCommand = da1.InsertCommand
            da2.DeleteCommand = da1.DeleteCommand
            da2.UpdateCommand = da1.UpdateCommand
    
            'Add a record to the table.
    
            Dim tblCust As DataTable
            tblCust = custDS.Tables("Customers")
    
            Dim drCust As DataRow
    
            drCust = tblCust.NewRow()
            drCust("CustomerID") = "ZYYYY"
            drCust("CompanyName") = "Zora's Yummies"
            drCust("ContactName") = "Christophe Namby"
            drCust("ContactTitle") = "Assistant Manager"
    
            tblCust.Rows.Add(drCust)
    
            'Update the backend.
    
            Debug.WriteLine("Length da1 before insert: " & da1.InsertCommand.CommandText.Length)
    
            da1.Update(custDS, "Customers")
    
            Debug.WriteLine("Length da1 after insert: " & da1.InsertCommand.CommandText.Length)
            Debug.WriteLine("length da2 before insert: " & da2.InsertCommand.CommandText.Length)
    
            da2.Update(custDS, "Customers")
    
            Debug.WriteLine("Length da2 after insert: " & da2.InsertCommand.CommandText.Length)
    					
  5. Modificar a seqüência de conexão para conectar ao computador do Microsoft SQL Server.
  6. Pressione a tecla F5 para executar o código.
  7. Comentário sem a seguinte linha para resolver esse problema:
            da1.Update(custDS, "Customers")
    					
Essa resolução funciona porque CommandBuilder conecta o evento RowUpdating em DataAdapter ("da1") para que ele saiba quando gerar os comandos. Quando você copia os comandos para um diferente DataAdapter ("da2"), o CommandBuilder não está conectado ao seus eventos e não altera-los.

Escopo da variável é importante porque se SqlCommandBuilder ("cb") e "da1" vá fora do escopo e coleta de lixo ocorre, CommandBuilder define seus comandos como Nothing (ou Nulo no Visual translation from VPE for Csharp). Portanto, você não pode usar esses comandos em "da2." Como coleta de lixo pode ocorrer em momentos aleatórios, a chamada do método da2.Update pode gerar erros de NullReferenceException intermitentes.

Propriedades

ID do artigo: 310366 - Última revisão: segunda-feira, 24 de fevereiro de 2014 - Revisão: 1.7
A informação contida neste artigo aplica-se a:
  • Microsoft ADO.NET 2.0
  • Microsoft ADO.NET (included with the .NET Framework)
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic 2005
Palavras-chave: 
kbnosurvey kbarchive kbmt kbtshoot kberrmsg kbprb kbsqlclient kbsystemdata KB310366 KbMtpt
Tradução automática
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: 310366

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com