Опубликован: 05.08.2007 | Уровень: специалист | Доступ: платный
Лекция 12:

Методы и свойства объекта DataAdapter. передача изменений в базу данных при помощи объекта Command

Свойство TableMappings. Окно QuickWatch

При создании базы данных в ней определяются названия столбцов. При выводе таблицы в элемент DataSet часто бывает нужно изменить эти названия. Самый простой способ это сделать - использовать SQL-запрос, содержащий псевдонимы. Скопируйте папку приложения FillMethod и переименуйте ее в "Psevdonim". Изменим строку commandText следующим образом3Здесь и далее будут применяться названия на кириллице. Это сделано для наглядности - в реальных приложениях следует использовать латинские буквы.:

string commandText = "SELECT CustomerID AS Номер_клиента,
 CompanyName AS Компания, ContactName AS Имя,
 ContactTitle AS Должность, Address AS Адрес, City AS Город,
 Region AS Регион," + "PostalCode AS Индекс,
 Country AS Страна, Phone AS Телефон, Fax AS Факс FROM Customers";

Оператор AS представляет названия поля, например, CustomerID в виде псевдонима "Номер_клиента", который будет заголовком столбца в объекте DataSet. Изменим фрагмент кода в конструкторе формы:

dataAdapter.Fill(ds);
dataGrid1.DataSource = ds.Tables[0].DefaultView;

Запустив приложение, мы обнаруживаем, что заголовки столбцов появились с новыми названиями (рис. 12.3):

 Применение псевдонимов

Рис. 12.3. Применение псевдонимов

Подобный SQL-запрос действительно удобно применять при выводе информации только для чтения. Если же требуется определить структуру объекта DataSet не только для вывода, но и для изменений данных, использование псевдонимов может оказаться достаточно сложным. Надежный способ решить эту же задачу - задействовать свойство TableMappings объекта DataAdapter. Рассмотрим вначале визуальные средства студии для настройки свойства. Создайте новое приложение и назовите его VisualTableMappings. Из окна Server Explorer перетаскиваем на форму таблицу Customers базы данных MS SQL " NorthwindCS4Или базы данных "Northwind". " (рис. 12.4):

 Перемещение таблицы "Customers" на форму

Рис. 12.4. Перемещение таблицы "Customers" на форму

Выбираем появившейся элемент sqlDataAdapter1, переходим в окно Properties, в поле свойства TableMappings нажимаем на кнопку(...) (рис. 12.5, А). В появившемся окне Table Mappings называем таблицу в DataSet "Клиенты", а затем переименовываем поля следующим образом (рис. 12.5, Б):

Source Columns Dataset Columns
СustomerID Номер_клиента
CompanyName Компания
ContactName Имя
ContactTitle Должность
Address Адрес
City Город
Region Регион
PostalCode Индекс
Country Страна
Phone Телефон
Fax Факс
 Свойство TableMappings. А - переход к настройке, Б - задание заголовков столбцов

увеличить изображение
Рис. 12.5. Свойство TableMappings. А - переход к настройке, Б - задание заголовков столбцов

Завершив настройку, нажимаем кнопку OK. Выделяем объект sqlDataAdapter1, в окне Properties щелкаем на ссылку "Generate DataSet". В появившемся окне вводим название "dsCustomers". Перетаскиваем на форму элемент DataGrid и его свойству Dock устанавливаем значение "Fill". В свойстве DataSource выбираем из выпадающего списка значение "dsCustomers1.Клиенты" - в результате на элементе появляются заголовки столбцов. Переходим в код формы, подключаем пространство имен для работы с базой данных:

using System.Data.SqlClient;

В конструкторе формы заполняем объект DataSet данными:

public Form1()
{
	InitializeComponent();
	sqlDataAdapter1.Fill(dsCustomers1);
}

Запущенное приложение будет выглядеть так же, как и в случае применения псевдонимов (см. рис. 12.3).

Посмотрим, какие поля будут находиться в DataSet во время выполнения программы, после того как мы применили свойство TableMappings. Поставим точку остановки в строке заполнения данными (рис. 12.6):

 Точка остановки. Для ее установки или удаления  дважды щелкаем на поле

Рис. 12.6. Точка остановки. Для ее установки или удаления дважды щелкаем на поле

Запускаем приложение. Программа прервет свое выполнение на точке остановки. Установив курсор на объект dsCustomers1, вызываем контекстное меню, в котором выбираем пункт "QuickWatch_" (рис. 12.7):

 Вызов окна "QuickWatch:" во время выполнения программы

увеличить изображение
Рис. 12.7. Вызов окна "QuickWatch:" во время выполнения программы

Диалоговое окно QuickWatch предназначено для быстрого расчета значения переменной (рис. 12.8). В столбцах Name, Value и Type этого окна отображаются сведения только об одной переменной, из него переменную можно добавить в окно Watch, а затем изменить ее значение, введя новое значение в столбец Value (рис. 12.9).

 Окно QuickWatch. Добавление столбца "Адрес"

увеличить изображение
Рис. 12.8. Окно QuickWatch. Добавление столбца "Адрес"
 Окно Watch. Изменение названия в поле "Value"

Рис. 12.9. Окно Watch. Изменение названия в поле "Value"

Оставим, однако, названия полей, определенные в окне Table Mappings.

В программном обеспечении к курсу вы найдете приложения Psevdonim и VisualTableMappings (Code\Glava6).

Перейдем к программному определению свойства TableMappings. Создайте новое приложение и назовите его ProgrammTableMappings. Перетаскиваем на форму элемент DataGrid, его свойству Dock устанавливаем значение Fill. В классе формы определяем строки commandText и connectionString:

string commandText = "SELECT CustomerID, CompanyName,
 ContactName, ContactTitle, Address, City, Region," +
 " PostalCode, Country, Phone, Fax FROM Customers";
string connectionString = "workstation id=7EA2B2F6068D473;integrated
 security=SSPI;data sou" + "rce=\"(local)\";persist
 security info=False;initial catalog=NorthwindCS";

Подключаем пространства имен для работы c базой данных и классом DataTableMapping:

using System.Data.SqlClient;
using System.Data.Common;

В конструкторе формы создаем объекты SqlConnection, SqlCommand и SqlDataAdapter:

SqlConnection conn = new SqlConnection();
conn.ConnectionString = connectionString;
SqlCommand myCommand = new SqlCommand();
myCommand.Connection = conn;
myCommand.CommandText = commandText;
SqlDataAdapter dataAdapter = new SqlDataAdapter();
dataAdapter.SelectCommand = myCommand;

Создаем экземпляр dtMapping класса DataTableMapping, устанавливаем соответствие между таблицами "Table" базы данных и "DataSetTable Customers" объекта DataSet:

DataTableMapping dtMapping =
 new DataTableMapping("Table",
 "DataSetTableCustomers");

Почему таблица Customers, которую мы извлекаем, здесь называется "Table"? Дело в том, что у объекта DataAdapter нет возможности определить, как называется таблица в базе, и он подставляет предположительное название "Table". Второй параметр, DataSetTableCustomers, - это произвольно задаваемое название таблице в DataSet.

Создаем экземпляр dcMappings класса DataColumnMapping, в котором определяем названия полей в DataSet:

DataColumnMapping[] dcMappings = 
{
	new DataColumnMapping("CustomerID", "Номер_клиента"),
	new DataColumnMapping("CompanyName", "Компания"),
	new DataColumnMapping("ContactName", "Имя"),
	new DataColumnMapping("ContactTitle", "Должность"),
	new DataColumnMapping("Address", "Адрес"),
	new DataColumnMapping("City", "Город"),
	new DataColumnMapping("Region", "Регион"),
	new DataColumnMapping("PostalCode", "Индекс"),
	new DataColumnMapping("Country", "Страна"),
	new DataColumnMapping("Phone", "Телефон"),
	new DataColumnMapping("Fax", "Факс"),
};

Добавляем созданный экземпляр dcMappings в коллекцию ColumnMappings объекта dtMapping:

dtMapping.ColumnMappings.AddRange(dcMappings);

Готовый объект dtMapping передаем в DataAdapter, используя его свойство TableMappings:

dataAdapter.TableMappings.Add(dtMapping);

Создаем и заполняем объект DataSet данными:

DataSet dsCustomers = new DataSet();
dataAdapter.Fill(dsCustomers);
dataGrid1.DataSource =
 dsCustomers.Tables["DataSetTableCustomers"].DefaultView;

Запускаем приложение. Его вид будет в точности такой же, как и в случае применения псевдонимов (см. рис. 12.3).

В программном обеспечении к курсу вы найдете приложение Programm TableMappings (Code\Glava6 ProgrammTableMappings).

Александра Тимофеева
Александра Тимофеева
Украина, Киев
Bakke Aleksander
Bakke Aleksander
Россия, Mуниципальный округ N 4