Передача изменений в базу данных при помощи хранимых процедур. Объект CommandBuilder
Метод GetChanges объекта DataSet
Объекты DataSet и DataTable предоставляют перегруженный метод GetChanges, конструктор которого имеет следующий вид (рис. 13.13):
увеличить изображение
Рис. 13.13. Метод GetChanges. A - конструктор для объекта DataSet, Б - конструктор для объекта DataTable
Метод GetChanges возвращает новый объект DataSet или DataTable cо структурой исходного объекта, но содержащий только измененные записи из исходного объекта. На рис. 13.13 исходными объектами являются myDataSet и myDataTable, а новыми, созданными методом GetChanges - newDataSet и newDataTable. Применяя в качестве параметра значение перечисления DataRowState, можно получить записи с конкретным состоянием, например, только удаленные ( Deleted ) или добавленные ( Added ).
При передаче изменений в базу данных отправка объекта DataSet, полученного в результате вызова метода GetChanges, позволяет уменьшить объем трафика. В самом деле, отправка только внесенных изменений при прочих равных условиях займет меньше ресурсов, чем отправка полного объекта DataSet. Это становится особенно важным при работе с большими объемами данных или значительным числом подключений.
Метод GetChanges также применяется в качестве своеобразного сигнального флага, сообщающего, были ли затронуты данные. Создайте новое Windows-приложение и назовите его "GetChangesMethod". С помощью визуальных средств студии4Просто перейдите в окно "Server Explorer" и перетащите на форму таблицу из узла базы данных имеющегося подключения, затем сгенерируйте объект DataSet. настраиваем подключение к базе данных Microsoft SQL "BDTur_firm2" для извлечения таблицы "Туристы". Названия объектов ADO .NET оставляем по умолчанию. В конструкторе формы заполняем данными объект DataSet11 и затем выводим их в элемент DataGrid:
public Form1() { InitializeComponent(); sqlDataAdapter1.Fill(dataSet11); dataGrid1.DataSource = dataSet11.Tables[0].DefaultView; }
В обработчике события Closing формы проверяем изменения в объекте DataSet11 при помощи метода GetChanges и в случае их наличия выводим диалоговое окно:
private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e) { DataSet ds = dataSet11.GetChanges(); if(ds == null) return; if(MessageBox.Show("Вы хотите сохранить изменения в базе данных?", "Завершение работы", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) sqlDataAdapter1.Update(ds); }
Запускаем приложение. При закрытии формы после внесения изменений появляется диалоговое окно, в котором предлагается изменения сохранить (рис. 13.14):
В программном обеспечении к курсу вы найдете приложение GetChanges Method (Code\Glava6\ GetChangesMethod).
Метод Merge объекта DataSet
Метод Merge объекта DataSet предназначен для объединения имеющегося содержимого объекта DataSet с содержимым другого объекта DataSet, DataTable или набором строк DataRow:
myDataSet.Merge(newDataSet)
Здесь myDataSet - исходный объект DataSet, newDataSet - новый или другой объект. Представим себе такую ситуацию: у нас имеется объект DataSet, содержащий таблицу "Туристы". Другой объект DataSet содержит таблицу "Туры". Каждая из этих таблиц в своем объекте DataSet представлена соответствующими объектами DataTable. После вызова метода Merge основного объекта DataSet он будет содержать таблицу со своими исходными столбцами и новыми. Поскольку записи в обеих таблицах независимы, пустые ячейки будут заполнены значениями null (рис. 13.15):
На практике более интересен случай объединения таблиц с одинаковой структурой. При их объединении будет происходить формирование новой таблицы с распределением записей согласно значениям первичного ключа (рис. 13.16):
Клиентское приложение, как правило, предоставляет несколько режимов изменения данных. После завершения редактирования возникает проблема объединения всех исправлений в один объект DataSet для последующей их отправки в базу данных. Создание нескольких объектов DataSet с идентичной структурой и применение метода Merge - оптимальный способ решения этой задачи.
Создайте новое Windows-приложение и назовите его "MergeMethod". При помощи визуальных средств студии настраиваем подключение к базе данных Microsoft SQL "BDTur_firm2" для извлечения таблицы "Туристы". Названия объектов ADO .NET оставляем по умолчанию. Добавляем на форму элемент управления DataGrid, его свойству Dock устанавливаем значение Fill. Для отключения доступности элемента его свойству Enabled устанавливаем значение "False". Переходим в окно Solution Explorer, щелкаем правой кнопкой на имени проекта MergeMethod, в появившемся меню переходим к пункту "Add \ Add New Item". В появившемся окне выбираем новый шаблон "Windows Form" и нажимаем кнопку "Open". Устанавливаем следующие значения свойств новой формы:
Form2, свойство | Значение |
---|---|
FormBorderStyle | FixedSingle |
MaximizeBox | False |
MinimizeBox | False |
Size | 250; 220 |
Text | Добавление туриста |
Подключаем пространство имен Data:
using System.Data;
В классе формы создаем объект DataTable:
public DataTable dtNewTourist = null;
Открываем проект Change_Data (мы работали с ним в этой лекции), выделяем четыре текстовых поля и четыре соответствующих надписи, копируем их, затем размещаем их на форме Form2 в текущем проекте. Добавляем на форму кнопку, в свойстве Name вводим "btnOK", в свойстве Text - "&OK". В обработчике этой кнопки создаем запись DataRow, в которую будут помещаться значения, вводимые в текстовые поля:
private void btnOK_Click(object sender, System.EventArgs e) { DataRow drNewTourist = dtNewTourist.NewRow(); drNewTourist["Кодтуриста"] = txtID.Text; drNewTourist["Фамилия"] = txtLastName.Text; drNewTourist["Имя"] = txtFirstName.Text; drNewTourist["Отчество"] = txtMiddleName.Text; dtNewTourist.Rows.Add(drNewTourist); this.Close(); }
Переключаемся в режим дизайна главной формы. Добавляем на форму элемент управления Panel, его свойству Dock устанавливаем значение "Bottom". Из окна Toolbox перетаскиваем на панель кнопку, в свойстве Name вводим "btnAdd", в свойстве Text - "&Добавить". В обработчике этой кнопки вызываем вторую форму и в случае подтверждения диалога объединяем изменения, вызывая метод Merge:
private void btnAdd_Click(object sender, System.EventArgs e) { Form2 f2 = new Form2(); //Определяем структуру объекта dtNewTourist f2.dtNewTourist = dataSet11.Tables["Туристы"]; if(f2.ShowDialog() == DialogResult.OK) { //Создаем объект dtForMerge для передачи // конструктору метода Merge DataTable dtForMerge = f2.dtNewTourist; dataSet11.Merge(dtForMerge); } }
Здесь мы применили четвертый из семи возможных конструкторов метода Merge (рис. 13.17):
В конструкторе формы заполняем объект DataSet и определяем источник данных для элемента DataGrid:
public Form1() { InitializeComponent(); sqlDataAdapter1.Fill(dataSet11); dataGrid1.DataSource = dataSet11.Tables[0].DefaultView; }
Наконец, в обработчике события Closing формы передаем изменения в базу данных:
private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e) { sqlDataAdapter1.Update(dataSet11); }
Запускаем приложение. При нажатии на кнопку "Добавить" появляется окно "Добавление туриста", в котором вводятся значения полей. После закрытия этого окна новая запись появляется в таблице (рис. 13.18):
В программном обеспечении к курсу вы найдете приложение Merge Method (Code\Glava6\MergeMethod).