Украина, Киев |
Методы и свойства объекта 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):
Подобный SQL-запрос действительно удобно применять при выводе информации только для чтения. Если же требуется определить структуру объекта DataSet не только для вывода, но и для изменений данных, использование псевдонимов может оказаться достаточно сложным. Надежный способ решить эту же задачу - задействовать свойство TableMappings объекта DataAdapter. Рассмотрим вначале визуальные средства студии для настройки свойства. Создайте новое приложение и назовите его VisualTableMappings. Из окна Server Explorer перетаскиваем на форму таблицу Customers базы данных MS SQL " NorthwindCS4Или базы данных "Northwind". " (рис. 12.4):
Выбираем появившейся элемент 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 | Факс |
увеличить изображение
Рис. 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):
Запускаем приложение. Программа прервет свое выполнение на точке остановки. Установив курсор на объект dsCustomers1, вызываем контекстное меню, в котором выбираем пункт "QuickWatch_" (рис. 12.7):
Диалоговое окно QuickWatch предназначено для быстрого расчета значения переменной (рис. 12.8). В столбцах Name, Value и Type этого окна отображаются сведения только об одной переменной, из него переменную можно добавить в окно Watch, а затем изменить ее значение, введя новое значение в столбец Value (рис. 12.9).
Оставим, однако, названия полей, определенные в окне 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).