Технология Microsoft ADO.NET

       

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


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

Создайте новое Windows-приложение и назовите его "Change_Data". Для ускорения разработки интерфейса выделяем и копируем все элементы на форме приложения DataBindings, которое мы создали во второй лекции. Располагаем вставленные элементы на форме приложения 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):


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

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


Содержание раздела