Чтение онлайн

ЖАНРЫ

ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание

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

Шрифт:

private void CreateDataView {

 // Установка таблицы для представления.

 coltsOnlyView = new DataView(inventoryTable);

 // Настройка представления с помощью фильтра.

 coltsOnlyView.RowFilter = "Make = 'Colt'";

 // Привязка к элементу управления,

 dataGridColtsView.DataSource = coltsOnlyView;

}

Как видите, класс DataView предлагает свойство RowFilter, содержащее строку критериев фильтрации, используемую для поиска соответствующих строк.

После получения объекта представления соответственно устанавливается свойство DataSource элемента управления. На рис. 22.17 показано окно готового приложения.

Рис. 22.17. Представление отфильтрованных данных

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

Работа с адаптерами данных

Теперь, когда вы знаете возможности использования типов DataSet ADO.NET, обратим внимание на адаптеры данных. Напомним, что объекты адаптера данных используются для "наполнения" DataSet объектами DataTable и возврата измененных объектов DataTable базе данных для обработки. Описания основных членов базового класса DbDataAdapter приведены в табл. 22.15.

Таблица 22.15. Основные члены класса DbDataAdapter 

Члены Описание
SelectCommand InsertCommand UpdateCommand DeleteCommand Задают SQL-команды, которые будут отправлены хранилищу данных при вызове метода Fill или Update
Fill Заполняет данную таблицу в DataSet некоторым набором записей, зависящим от заданного объектом команды значения SelectCommand
Update Обновляет DataTable, используя объекты команд из свойств InsertCommand, UpdateCommand или DeleteCommand. Точная команда, которая при этом выполняется, зависит от значения RowState для данного DataRow в данном объекте DataTable (данного DataSet)

В следующих примерах не забывайте о том, что объекты адаптера данных управляют соответствующим соединением с базой данных за вас, так что вам не придется явно открывать или закрывать сеанс связи с СУБД. Тем не менее, вам все равно нужно предоставить адаптеру данных действительный объект соединения или, в виде аргумента конструктора, строку соединения (которая будет использоваться для построения внутреннего объекта соединения).

Заполнение DataSet с помощью адаптера данных

Создайте новое консольное приложение с именем FillDataSetWithSqlDataAdapter, указав в нем использование пространств имен System.Data и System. Data.SqlClient. Обновите метод Main так, как предлагается нише (для простоты здесь не показан блок try/catch).

static void Main(string[] args) {

 Console.WriteLine("***** Забавы с адаптерами данных ***** \n");

 string cnStr = "uid=sa;pwd=;Initial Catalog=Cars;Data Source=(local)";

 // Заполнение DataSet новыми DataTable.

 DataSet myDS = new DataSet("Cars");

 SqlDataAdapter dAdapt = new SqlDataAdapter("Select * From Inventory".cnStr);

 dAdapt.Fill(myDS, "Inventory");

 // Отображение содержимого.

 PrintDataSet(myDS);

}

Обратите внимание на то, что адаптер данных создается с указанием SQL-оператора Select. Это значение будет использоваться для внутреннего построения объекта команды, которую затем можно будет получить,

выбрав свойство SelectCommand. Далее, заметьте, что метод Fill получает экземпляр типа DataSet и необязательное строковое имя, которое будет использоваться при установке свойства TableName нового объекта DataTablе (если вы не укажете имя таблицы, адаптер данных использует для таблицы имя Table).

Замечание. Метод Fill возвращает целое число, соответствующее числу строк, затронутых SQL-запросом.

Как и следует ожидать, при передаче DataSet методу PrintDataSet (реализованному в этой главе ранее) будет получен список всех строк таблицы Inventory базы данных Cars (рис. 22.18).

Отображение имен базы данных в понятные имена

Вы, скорее всего, знаете, что администраторы баз данных склонны создавать имена, таблиц и столбцов, которые нельзя назвать понятными для конечных пользователей. Но хорошей вестью является то, что объекты адаптера данных поддерживают внутреннюю строго типизованную коллекцию (DatаTableМаррing-Collection) типов System.Data.Common.DataTableMapping, доступную с помощью свойства TableMappings.

Рис. 22.18. Заполнение DataSet с помощью объекта адаптера данных

При желании вы можете использовать эту коллекцию для того, чтобы информировать DataTable о "дисплейных именах", которые должны использоваться при выводе содержимого. Предположим, например, что вы хотите отобразить имя Inventory, используемое для таблицы в рамках СУБД, в дисплейное имя Ассортимент. Кроме того, предположим, что вы хотите отобразить имя столбца CarID в виде Номер, а имя столбца PetName – в виде Название. Для этого в объект адаптера данных перед вызовом метода Fill добавьте следующий программный код (и не забудьте указать using для пространства имен System.Data.Common).

static void Main(string[] args) {

 …

 // Отображение имен столбцов БД в имена, понятные пользователю.

 DataTableMapping custMap = dAdapt.TableMappings.Add("Inventory", "Ассортимент");

 custMap.ColumnMappings.Add("CarID", "Номер");

 custMap.ColumnMappings.Add("PetName", "Название");

 dAdapt.Fill(myDS, "Inventory");

 …

}

Теперь, выполнив программу, вы обнаружите, что метод PrintDataSet отображает "понятные" имена объектов DataTable и DataRow, а не имена, заданные структурой базы данных.

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

Обновление базы данных с помощью объекта адаптера данных

Адаптеры данных могут не только заполнять для вас таблицы объекта DataSet. Они могут также поддерживать набор объектов основных SQL-команд, используя их для возвращения модифицированных данных обратно в хранилище данных. При вызове метода Update адаптера данных проверяется свойство RowState для каждой строки в DataTable и используются соответствующие SQL-команды, присвоенные свойствам DeleteCommand, InsertCommand и UpdateCommand, чтобы записать изменения данного DataTable в источник данных.

Чтобы проиллюстрировать процесс использования адаптера данных для возвращения изменении DataTable в хранилище данных, в следующем примере мы переработаем приложение CarsInventoryUpdater, созданное в этой главе ранее, чтобы на этот раз использовать DataSet и объект адаптера данных. Поскольку значительная часть приложения останется той же, сконцентрируем свое внимание на изменениях, которые необходимо сделать в методах DeleteCar. UpdateCarPetName и InsertNewCar (чтобы уточнить детали, проверьте текст загружаемого программного кода для данного примера).

Поделиться с друзьями: