Для автоматической генерации команд нужно указать объект SelectCommand адаптера данных DataAdapter. Объект CommandBuilder использует схему таблицы, полученную с помощью метода Select объекта SelectCommand для генерации соответствующей команды вставки, обновления или удаления. Учтите, что поля, возвращаемые объектом SelectCommand, должны содержать первичный ключ или поле с уникальными значениями.
Изменение текста команды SELECT после автоматической генерации команд обновления может привести к возникновению исключительных ситуаций при одновременном выполнении этой команды обновления. Если в исходной команде SELECT, на основании которой автоматически генерируются команды обновления данных, содержались поля, которых уже нет в генерированной команде, то при выполнении одной из команд обновления с помощью метода Update объекта DataAdapter может произойти попытка обращения к уже несуществующим полям и возникновение исключительной ситуации. Для исключения этой проблемы следует вызвать метод RefreshSchema объекта CommandBuilder после изменения свойства SelectCommand объекта DataAdapter или после изменения текста (объект CommandText) данной команды.
Даже после того как объект CommandBuilder автоматически сгенерировал команды вставки, обновления или удаления, соответствующие им свойства объекта DataAdapter не изменяются. Объект CommandBuilder скрывает сгенерированные команды, и доступ к ним можно получить с помощью методов GetInsertCommand, GetUpdateCommand и GetDeleteCommand.
Хотя конструктор команд CommandBuilder прост в применении, нужно учитывать его ограничения. Основное ограничение связано с тем, что нельзя проконтролировать выполняемые им действия, т.е. задать его конфигурацию. Он просто генерирует команды обновления на основе заданной команды SELECT без каких-либо параметров. Кроме того, он предназначен для выполнения команд по отношению к одной таблице базы данных. Иначе говоря, объект DataTable с результатами объединения таблиц не может использоваться объектом CommandBuilder. Более того, команды генерируются для одной таблицы без учета ее возможных связей с другими таблицами базы данных, что может привести к нарушению целостности данных при наличии между таблицами родительско-дочерних отношений.
Еще одно ограничение объекта CommandBuilder связано с тем, что он не способен генерировать команды обновления, если имя таблицы или поля содержит специальные символы, например пробел, точку или другие не буквенно-цифровые символы, даже если это имя заключено в кавычки. Однако он может работать с полностью квалифицированными именами таблиц в формате
Чтобы извлекать и сохранять данные в базе данных с помощью объекта DataAdapter, создадим в проекте DataSetCode еще одну форму. Для этого выполните перечисленные ниже действия.
1. Создайте новую кнопку непосредственно под кнопкой DataAdapter Fill, перетаскивая ее из панели элементов управления. В окне свойств Properties укажите значение btnDataAdapterUpdate для свойства (Name) и значение DataAdapter Updates для свойства Text.
2. Создайте в проекте DataSetCode новую форму.
3. В окне свойств Properties укажите значение frmUpdates для свойства (Name) и значение DataAdapter Updates для свойства Text.
4. Увеличьте размер формы frmUpdates.
5. Создайте в правой части формы сетку данных DataGrid, перетаскивая ее из панели элементов управления.
6. В окне Properties укажите значение grdDataGrid для свойства (Name) сетки данных.
7. Увеличьте размер сетки данных, чтобы она занимала до 80% всей площади формы.
8. В верхнем левом углу формы создайте кнопку, перетаскивая ее из панели элементов управления.
9. В окне Properties укажите значение btnLoad для свойства (Name) и значение Load для свойства Text этой кнопки.
10. Создайте новую кнопку непосредственно под кнопкой btnLoad, перетаскивая ее из панели элементов управления.
11. В окне Properties укажите значение btnLoad для свойства (Name), значение Load для свойства Text и значение False для свойства Enabled этой кнопки.
12. В верхней части файла с кодом формы frmUpdates введите следующий код:
Imports System
Imports System.Data
Imports System.Data.SqlClient
13. Затем в код формы frmUpdates введите код из листинга 6.3.
Private dsEmployeeInfo As DataSet
Private daEmployees As SqlDataAdapter
Private conn As New SqlConnection( _