надписью
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вообще. Создавать свои собственныеКоманда:объекты, или использовать визуальные инструменты для анализа их написания.
Такое поведение является особенностью данного продукта..
Действия по воспроизведению поведения
- Создайте новый проект приложения Windows Visual Basic. По умолчанию в проект добавляется форма Form1.
- Дважды щелкните форму и добавьте следующий код в верхней части окна код:
Imports System.Data.SqlClient
- ДобавитьКнопкаУправление на форму Form1.
- Дважды щелкните кнопку и добавьте следующий код длязатем –Событие::
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)
- Измените строку подключения и подключения к компьютеру Microsoft SQL Server.
- Нажмите клавишу F5 для выполнения кода.
- Закомментируйте следующую строку, чтобы устранить эту проблему:
da1.Update(custDS, "Customers")
Это решение работает, потому что
CommandBuilderловушки
RowUpdatingсобытие
Объект DataAdapter(«da1»), что он знает, что при генерации команд. При копировании в другой команды
Объект DataAdapter(«da2»),
CommandBuilderбольше не будет привязать на его события и не изменяет их.
Область видимости переменной является важным потому что если «da1» и
SqlCommandBuilder(«cb") перейти из области видимости, и в случае сборка мусора
CommandBuilderЗадает его команды
Ничего не(или
NULL,в Visual C#). Таким образом нельзя использовать эти команды в «da2.» Так как сборка мусора может возникать случайным образом время
da2.Updateвызов метода может вызывать временные ошибки NullReferenceException.
Код статьи: 310366 - Последнее изменение :: 23 ноября 2010 г. - Редакция: 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
| kbtshoot kberrmsg kbprb kbsqlclient kbsystemdata kbmt KB310366 KbMtru |
Переведено с помощью машинного переводаВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:
310366
(http://support.microsoft.com/kb/310366/en-us/
)