Читать «ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание» онлайн - страница 600

Эндрю Троелсен

Хотя идея получить кое-что, не предлагая ничего взамен, понравится многим, важно понять, что построители команд имеют некоторые (весьма важные) ограничения. В частности, построитель команд может автоматически генерировать SQL-команды для адаптера данных только в том случае, когда выполнены все следующие условия.

• Соответствующая команда Select взаимодействует только с одной таблицей (так что, например, соединения таблиц не допускаются).

• Для этой единственной таблицы назначен первичный ключ.

• Столбцы, представляющие первичный ключ, присутствуют в данном SQL-операторе Select.

Так или иначе, рис. 22.19 демонстрирует, что указанная строка удаляется из физической базы данных (при анализе программного кода этого примера следует различать значение CarID и порядковый номер строки).

Рис. 22.19. Использование автоматически генерируемых команд SQL

Исходный код. Проект MySqlCommandBuilder размещен в подкаталоге, соответствующем главе 22.

Объекты DataSet с множеством таблиц и объекты DataRelation

До этого момента во всех примерах данной главы объекты DataSet содержали по одному объекту DataTable. Однако вся мощь несвязного уровня ADO.NET проявляется тогда, когда DataSet содержит множество объектов DataTable. В этом случае вы можете добавить в коллекцию DataRelation объекта DataSet любое число объектов DataRelation, чтобы указать взаимные связи таблиц. Используя эти объекты, клиентское звено приложения сможет осуществлять переходы между таблицами без пересылки данных по сети.

Для демонстрации возможностей использования объектов DataRelation создайте новый проект Windows Forms с именем MultitabledDataSet. Графический интерфейс пользователя этого приложения достаточно прост. На рис. 22.20 вы можете видеть три элемента управления DataGridView, содержащие данные из таблиц Inventory, Orders и Customers базы данных Cars. Кроме того, там присутствует одна кнопка, с помощью которой информация обо всех изменениях направляется в хранилище данных.

Рис. 22.20. Просмотр связанных объектов DataTable

Чтобы упростить ситуацию, тип MainForm будет использовать построители команд (по одному для каждой таблицы) для автоматического генерирования SQL-команд каждого из трех объектов SqlDataAdapter. Вот исходная модификация соответствующего экземпляра типа Form:

public partial class MainForm: Form {

 // Объект DataSet для формы.

 private DataSet carsDS = new DataSet("CarsDataSet");

 // Применение построителей команд для упрощения

 // настройки адаптеров данных.

 private SqlCommandBuilder sqlCBInventory;

 private SqlCommandBuilder sqlCBCustomers;

 private SqlCommandBuilder sqlCBOrders;

 // Адаптеры данных (для каждой из таблиц).

 private SqlDataAdapter intTableAdapter;

 private SqlDataAdapter custTableAdapter;

 private SqlDataAdapter ordersTableAdapter;

 // Объект соединения для формы.

 private SqlConnection cn = new SqlConnection("server= (local);uid=sa;pwd=;database=Cars");