O objecto CommandBuilder pode reconstruir um comando que tenta modificar durante a chamada seguinte para o método DataAdapter.Update e podem perder as alterações para o comando

Traduções de Artigos Traduções de Artigos
Artigo: 310366 - Ver produtos para os quais este artigo se aplica.
Este artigo foi arquivado. Este artigo é oferecido "tal como está" e deixará de ser actualizado.
Este artigo faz referência à seguinte espaço de nomes Microsoft .NET Framework Class Library:
  • System.data.SqlClient
Expandir tudo | Reduzir tudo

Nesta página

Sintomas

O objecto CommandBuilder pode reconstruir um comando que tentar modificar durante a chamada seguinte para o método DataAdapter.Update e as alterações para o comando poderão ser perdidas. Este problema ocorre nas seguintes circunstâncias:
  • Se associar um objecto CommandBuilder um objecto de ' DataAdapter ' .
  • Se utilizar o método GetInsertCommand , GetUpdateCommand ou GetDeleteCommand do objecto CommandBuilder para comandos de atribuir explicitamente para o ' DataAdapter ' .
  • Se modificar um dos comandos que gera CommandBuilder .
Quando tenta chamar o método de actualização do ' DataAdapter ' , poderá receber a seguinte mensagem de erro:
Ocorreu uma excepção não processada do tipo 'System.Data.SqlClient.SqlException' no system.data.dll

Causa

Este problema ocorre porque CommandBuilder altera dinamicamente os comandos que gera para o comando original.

Resolução

Utilize um dos seguintes métodos para resolver este problema:
  • Não modifique comandos que gera CommandBuilder . CommandBuilder não altera os objectos de comando que criar manualmente.
  • Copie os objectos InsertCommand DeleteCommand e UpdateCommand para uma nova ' DataAdapter ' (consulte a secção "Mais informação" para obter um exemplo). Nova variável de ' DataAdapter ' tem de ter o mesmo âmbito ou mais estreita, a variável ' DataAdapter ' antiga.
  • Não utilize sequer CommandBuilder . Escrever os seus próprios objectos de comandos ou utilize ferramentas de dados Visual para as escreve.

Ponto Da Situação

Este comportamento ocorre por predefinição.

Mais Informação

Passos para reproduzir o comportamento

  1. Crie um novo projecto de aplicação do Windows do Visual Basic. Form1 é adicionado ao projecto por predefinição.
  2. Faça duplo clique no formulário e adicione o seguinte código na parte superior da janela Code:
    Imports System.Data.SqlClient
    					
  3. Adicione um controlo de botão ao Form1.
  4. Faça duplo clique 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 cadeia de ligação para ligar ao computador do Microsoft SQL Server.
  6. Prima a tecla F5 para executar o código.
  7. Comentário fora a seguinte linha para resolver este problema:
            da1.Update(custDS, "Customers")
    					
Esta resolução funciona porque CommandBuilder cria hooks o evento RowUpdating no ' DataAdapter ' ("da1") para que seja conhecido quando gerar os comandos. Quando copiar os comandos para uma diferente ' DataAdapter ' ("da2"), CommandBuilder já não está ligado no respectivos eventos e não os altera.

Âmbito variável é importante uma vez que se "da1" e SqlCommandBuilder ("cb") Ir fora do âmbito e recolha de lixo ocorre, CommandBuilder define respectivos comandos nada (ou nula no Visual C#). Assim, não pode utilizar estes comandos no "da2." Uma vez que recolha de lixo poderão ocorrer aleatoriamente, a chamada de método da2.Update poderá aumentar intermitentes NullReferenceException erros.

Propriedades

Artigo: 310366 - Última revisão: 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 310366

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