Опубликован: 05.08.2007 | Доступ: свободный | Студентов: 2200 / 83 | Оценка: 4.47 / 4.09 | Длительность: 20:11:00
ISBN: 978-5-9556-0097-0
Лекция 12:

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

Изменение записей

До этого момента мы рассматривали только извлечение записей для их просмотра. С помощью модели ADO .NET мы можем извлекать записи, менять их содержимое и вносить измененные записи в базу данных.

Создайте новое Windows-приложение и назовите его "Change_Data". Для ускорения разработки интерфейса выделяем и копируем все элементы на форме приложения DataBindings, которое мы создали во "Объекты ADO .NET" . Располагаем вставленные элементы на форме приложения Change_Data - при этом мы избавляемся от необходимости определять свойства Name и Text. Перетаскиваем объект oleDbDataAdapter из окна Toolbox, устанавливаем соединение с таблицей "Туристы" базы данных Microsoft Access BDTur_firm2.mdb (Code\Glava3 BDTur_firm2.mdb) . Генерируем объект DataSet и называем его "dsTourists". Связываем текстовые поля с соответствующими столбцами таблицы "Туристы", используя свойство DataBindings. В конструкторе формы вызываем метод Fill объекта DataAdapter:

public Form1()
		{
			InitializeComponent();
oleDbDataAdapter1.Fill(dsTourists1);
		}

Для проверки приложения запускаем его. Добавляем кнопки для навигации по записям и соответствующие обработчики, используя объект CurrencyManager (можно также воспользоваться готовым проектом DataBindings, изменяя названия объекта DataSet ). Добавим теперь кнопки для добавления и удаления записей. Располагаем на форме две кнопки - "Добавить" и "Удалить", в свойстве Name устанавливаем значения "btnAdd" и "btnRemove" соответственно. В обработчике кнопки "Добавить" вызываем метод AddNew объекта CurrencyManager:

private void btnAdd_Click(object sender, System.EventArgs e)
{
	cmRecords.AddNew();			
}

Для обработчика кнопки "Удалить" также используем встроенный метод RemoveAt, причем при отсутствии на форме записей вызываем окно предупреждения:

private void btnRemove_Click(object sender, System.EventArgs e)
{
	if(cmRecords.Count>0)cmRecords.RemoveAt(cmRecords.Position);
	else MessageBox.Show("Нет записи для удаления!",
	 "Удаление записи", MessageBoxButtons.OK,
	 MessageBoxIcon.Error);
}

Запускаем приложение. Теперь можно добавлять и удалять записи - однако все сделанные изменения хранятся в объекте DataSet и не передаются в базу данных. Перезапустив приложение, мы обнаружим, что все записи остались прежними. Добавляем кнопку "Обновить", свойству Name этой кнопки устанавливаем значение "btnUpdate". В обработчике кнопки создаем новый объект DataSet changes, в который будут записываться все изменения старого объекта dsTourists1 при помощи метода GetChanges. Методу Update объекта oleDbDataAdapter1 передаем новый объект changes и, наконец, вызываем метод AcceptChanges для подтверждения изменений:

private void btnUpdate_Click(object sender, System.EventArgs e)
{
DataSet changes = dsTourists1.GetChanges();
	oleDbDataAdapter1.Update(changes);
	dsTourists1.AcceptChanges();
}

Запускаем приложение, вносим новую запись и нажимаем кнопку "Обновить". Возникает сообщение об ошибке: "Additional information: Value cannot be null" ("Дополнительная информация: значение не может быть равным нулю"). Дело в том, что объект CurrencyManager сохраняет изменения в DataSet после того, как мы перейдем от редактируемой записи к следующей. Но кроме этого, подобная функциональность кнопки "Обновить" нас не может устраивать. Поэтому добавим блок для обработки исключений, который будет проверять наличие изменений в dsTourists1:

private void btnUpdate_Click(object sender, System.EventArgs e)
{
	if (dsTourists1.HasChanges())
		try
		{
		DataSet changes = dsTourists1.GetChanges();
		oleDbDataAdapter1.Update(changes);
		dsTourists1.AcceptChanges();
		}

		catch(Exception ex)
		{
			MessageBox.Show(ex.Message, "Неудачное
			 обновление", MessageBoxButtons.OK,
			 MessageBoxIcon.Error);
		}
			else				
		MessageBox.Show("Нет записей для изменения",
		 "Изменение записей", MessageBoxButtons.OK,
		 MessageBoxIcon.Information);
				
}

Теперь, если мы попытаемся внести изменения, не переходя к следующей записи, появится окно предупреждения "Нет записей для изменения". Более того, если связывание с базой данных окажется невозможным (например, она заблокирована), то в окне "Неудачное обновление" выйдет сообщение с кодом ошибки. Для того чтобы пользователю не приходилось задумываться о работе CurrencyManager, добавим в код кнопки "Обновить" отключение остальных кнопок на время редактирования записи:

private void btnAdd_Click(object sender, System.EventArgs e)
{
	cmRecords.AddNew();
	btnFirst.Enabled = false;
	btnLast.Enabled = false;
	btnNext.Enabled = false;
	btnPrevious.Enabled = false;
	btnRemove.Enabled = false;
	btnUpdate.Enabled = false;
		
}

Для возврата к обычному режиму добавим на форму кнопку "Сохранить", которая будет возвращать позицию на первую запись и включать остальные кнопки:

private void btnSave_Click(object sender, System.EventArgs e)

{
	cmRecords.Position = 0;
	btnFirst.Enabled = true;
	btnLast.Enabled = true;
	btnNext.Enabled = true;
	btnPrevious.Enabled = true;
	btnRemove.Enabled = true;
	btnUpdate.Enabled = true;
}

Теперь наше приложение позволяет просматривать, изменять и сохранять записи в базе данных (рис. 12.29):

 Готовое приложение "Change_Data"

Рис. 12.29. Готовое приложение "Change_Data"

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