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

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
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
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.
guardado não têm efeito

Aviso: Este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 310366 - Última Revisão: 02/24/2014 06:07:40 - Revisão: 1.7

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

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