ADO.NET. Управление базами данных. Связь по схеме OLE DB провайдера. Коррекция стилей DataGridView, страница 5

Обновление данных

Запустите приложение и убедитесь, что данные источника отображаются в DataGridView, который приобрел желаемый облик. Итак, мы связались с базой данных, прочли одну таблицу и, кажется, получили контроль над ней, так как имеем возможность изменять значения полей в DataGridView (и DataSet). Но для того, чтобы изменения достигли адресата — реальной таблицы в базе Students.mdb, надо еще потрудиться.

Адаптер данных (в нашем случае, объект класса OleDbDataAdapter) выполняет роль моста между отсоединенным потребителем (DataSet) и источником данных. Интерфейс IDataAdapter, который должен быть реализован любым адаптером, задает стандарт общения между источником и потребителем. Суть стандарта определена четырьмя методами интерфейса:

·  int Fill (DataSet ds); — заполняет строки таблицы потребителя данными, взятыми из строк таблицы поставщика с помощью команды, заданной свойством SelectCommand самого адаптера. Это свойство задается в момент создания адаптера параметром конструктора. Метод Fill создает в DataSet новую таблицу, если она в нем отсутствует, или заполняет старую.

·  int Update (DataSet ds); — выполняет команды типа INSERT, UPDATE и DELETE над таблицей поставщика данных, основываясь на данных DataSet. Каждая строка таблицы обрабатывается индивидуально, алгоритм выполнения команд довольно сложен, они имеют параметры, возвращают значения и возбуждают события.

·  IDataParameter[ ] GetFillParameters(); — выбирает параметры, передавемые поставщику при выполнении SQL-комад типа SELECT.

·  DataTable[ ] FillSchema (DataSet ds, SchemaType type); — добывает из DataSet схему таблицы, используя свойство SelectCommand. При этом создается и заполняется новая таблица (коллекция столбцов, ограничений, первичный ключ и т.д). Соединение с базой должно уже существовать. База открывается и (после создания схемы таблицы) автоматически закрывается. SchemaType — это enum { Mapped, Source }— учитывать или не учитывать отображения имен таблиц и колонок. Дело в том, что отображения имен в DataSet (копии базы данных) могут отличаться от оригинальных имен в самой базе данных.

Следующий фрагмент показывает, как узнать схему таблицы с помощью FillSchema. Опробуйте его и удалите.

DataTable[] dt = da.FillSchema (ds, SchemaType.Mapped);

DataColumnCollection dc = dt[0].Columns;

Console.WriteLine("\nКол-во столбцов : {0} ", dc.Count);

int i = 1;

foreach (DataColumn c in dc)

  Console.WriteLine("{0}. {1,-13}, типа:  {2}", i++, c.ColumnName, c.DataType);

Класс OleDbDataAdapter реализует еще один интерфейс: IDbDataAdapter, который определяет четыре свойства типа IDbCommand. Эти свойства помогают адаптеру оперировать четырьмя командами обмена данными: SELECT, INSERT, UPDATE и DELETE.

·  IDbCommand SelectCommand {get; set;} — управляет SQL-командой SELECT и используется внутри метода Update для выбора записей источника данных и передачи их в таблицы DataSet.

·  IDbCommand InsertCommand {get; set;} — управляет командой INSERT, используется внутри Update для вставки в источник новых записей, соответствующих новым строкам DataSet.

·  IDbCommand DeleteCommand {get; set;} — управляет командой DELETE, используется внутри Update для удаления тех записей источника данных, которые соответствуют удаленным строкам таблиц DataSet.

·  IDbCommand UpdateCommand {get; set;} — управляет командой UPDATE, используется внутри Update для замены тех записей источника данных, которые соответствуют овновленным строкам таблиц DataSet.

Если команда SelectCommand установлена, то остальные три могут быть сгенерированы автоматически. Это делается с помощью объекта класса CommandBuilder. Весьма удобная возможность для тех, кто не уверен в своих способностях составлять команды на языке SQL-запросов. Покажем, как пользоваться ею.

·  Для обновления используем кнопку Save. Добавьте ее в навигатор и установите свойство Text="Save", которое будет работать в обработчике события ItemClicked.