Объектом CommandBuilder может перестроить команды, что вы пытаетесь изменить при следующем вызове метода DataAdapter.Update и изменений в команду могут быть потеряны

Переводы статьи Переводы статьи
Код статьи: 310366 - Vizualiza?i produsele pentru care se aplic? acest articol.
Эта статья помещена в архив. Она предлагается "как есть" и обновляться не будет.
Данная статья ссылается на указанное ниже пространство имен библиотеки классов Microsoft .NET Framework.:
  • System.Data.SqlClient
Развернуть все | Свернуть все

В этой статье

Проблема

надписьюCommandBuilderобъект может перестроить команды, которые вы пытаетесь изменить во время следующего вызоваDataAdapter.Updateметод и изменений в команду могут быть потеряны. Данная проблема возникает в следующих случаях:
  • Если связатьCommandBuilderобъект сОбъект DataAdapterОбъект.
  • При использованииGetInsertCommand,GetUpdateCommand-или-GetDeleteCommandметодCommandBuilderобъект, который явным образом присвоить командыОбъект DataAdapter.
  • Если изменить одну из команд,CommandBuilderСоздает.
При попытке вызоваобновлениеметодОбъект DataAdapterПоявляется следующее сообщение об ошибке::
Произошло необработанное исключение типа "System.Data.SqlClient.SqlException" в system.data.dll

Причина

Эта проблема возникает из-заCommandBuilderдинамически изменяет команды, которую она генерирует обратно на исходную команду.

Решение

Чтобы устранить проблему, воспользуйтесь одним из указанных ниже способов.:
  • Не изменяйте команды,CommandBuilderСоздает.CommandBuilderне приводит к изменениюКоманда:объекты, созданные пользователем.
  • Скопируйте файлInsertCommand,Чтобы свойство DeleteCommand, иUpdateCommandобъекты в новыйОбъект DataAdapter(см. в разделе «Дополнительная информация» в качестве примера). НовыйОбъект DataAdapterПеременная должна иметь той же области действия или уже как старыйОбъект DataAdapterпеременная.
  • Не следует использоватьCommandBuilderвообще. Создавать свои собственныеКоманда:объекты, или использовать визуальные инструменты для анализа их написания.

Статус

Такое поведение является особенностью данного продукта..

Дополнительная информация

Действия по воспроизведению поведения

  1. Создайте новый проект приложения Windows Visual Basic. По умолчанию в проект добавляется форма Form1.
  2. Дважды щелкните форму и добавьте следующий код в верхней части окна код:
    Imports System.Data.SqlClient
    					
  3. ДобавитьКнопкаУправление на форму Form1.
  4. Дважды щелкните кнопку и добавьте следующий код длязатем –Событие::
    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. Измените строку подключения и подключения к компьютеру Microsoft SQL Server.
  6. Нажмите клавишу F5 для выполнения кода.
  7. Закомментируйте следующую строку, чтобы устранить эту проблему:
            da1.Update(custDS, "Customers")
    					
Это решение работает, потому чтоCommandBuilderловушкиRowUpdatingсобытиеОбъект DataAdapter(«da1»), что он знает, что при генерации команд. При копировании в другой командыОбъект DataAdapter(«da2»),CommandBuilderбольше не будет привязать на его события и не изменяет их.

Область видимости переменной является важным потому что если «da1» иSqlCommandBuilder(«cb") перейти из области видимости, и в случае сборка мусораCommandBuilderЗадает его командыНичего не(илиNULL,в Visual C#). Таким образом нельзя использовать эти команды в «da2.» Так как сборка мусора может возникать случайным образом времяda2.Updateвызов метода может вызывать временные ошибки NullReferenceException.

Свойства

Код статьи: 310366 - Последний отзыв: 21 февраля 2014 г. - Revision: 2.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft ADO.NET 2.0
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic 2005
Ключевые слова: 
kbnosurvey kbarchive kbtshoot kberrmsg kbprb kbsqlclient kbsystemdata kbmt KB310366 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке: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