Реклама:

Пример. То же самое, что в предыдущем примере, но с временным отключением ограничений.

//---отключаем ограничения

dsVUZ1.EnforceConstraints = false;

//---запоминаем изменения в произвольном порядке

aPrep.Update(dsVUZ1); aKaf.Update(dsVUZ1);

//---включаем ограничения dsVUZ1.EnforceConstraints = true;

6.1.8. Особенности отката изменений в связанных таблицах

Пусть в наборе данных ds1 имеем связанные таблицы - дочернюю Prep и родительскую Kaf. В процессе работы с такими таблицами всегда есть искушение откатить изменения в дочерней таблице и оставить в силе изменения, внесенные в родительскую таблицу. Такой откат будет срабатывать до тех пор, пока не изменится значение первичного ключа в родительской таблице. Тогда, откатив изменения в дочерней таблице, мы моментально получим исключение из-за нарушения ссылочной целостности.

Пример. Рассмотрим форму для работы со связанными таблицами Kaf и Prep (рис. 6.13). Кнопки, размещенные рядом с элементом управления DataGrid, позволяют подтверждать или откатывать изменения в таблице данных, с которой связан этот DataGrid. Особо нас интересует кнопка Отменить рядом с нижним объектом DataGrid, который связан с дочерней таблицей Prep. Обработчик события нажатия этой кнопки следующий:

private void btnRejectPrep_Click(object sender, System.EventArgs e) {

//---отменяем изменения в дочерней таблице

try

{

ds1.Prep.RejectChanges();

}

catch (Exception x)

{

MessageBox.Show("0iiiM6Ka обновления данных : "

+ (char)13 + (char)10 + x.Message)

}

}

Шумаков П. В.  ADO.NET и создание приложений баз данных в среде Microsoft Visual Studio .NET. Руководство разработчика с примерами на C#.

рис. 6.13

Изменим в первой записи таблицы Kaf значение первичного ключа - столбца KK -с 1 на 111. Как видно из рис. 6.14, значение этого столбца автоматически изменилось и в подчиненных записях таблицы Prep.

Шумаков П. В.  ADO.NET и создание приложений баз данных в среде Microsoft Visual Studio .NET. Руководство разработчика с примерами на C#.

рис 6.14

Если теперь откатить изменения в таблице Prep, нажав рассматривавшуюся выше кнопку Отменить, немедленно получим исключение вследствие нарушения целостности данных в наборе данных ds1 (рис. 6.15).

Шумаков П. В.  ADO.NET и создание приложений баз данных в среде Microsoft Visual Studio .NET. Руководство разработчика с примерами на C#.

рис. 6.15

Действительно, значение столбца KK в родительской записи таблицы Kaf останется прежним - 111, в то время как в соответствующих дочерних записях это значение вновь станет 1 .

_I

То же, впрочем, может произойти, если запоминать изменения, внесенные только в родительскую таблицу: стоит не запомнить или откатить изменения, внесенные в дочернюю таблицу, как ссылочная целостность в наборе данных нарушится. Произойдет это - и тогда сохраняются изменения только в дочерней таблице: ведь изменения в родительской таблице могут быть впоследствии отменены.

Из всего сказанного следует очевидный вывод. Если изменялись значения столбцов первичного ключа родительской таблицы, то все последующие действия по запоминанию или откату изменений должны касаться обеих таблиц: и дочерней и родительской.

Это правило может не соблюдаться, если заведомо известно, что значения столбцов первичного ключа ни в одной из записей родительской таблицы не изменялись. Чтобы быть в этом полностью уверенным, следует либо защитить эти столбцы от внесения изменений, либо отслеживать факты такого изменения программно, применяя для этой цели более или менее хитроумную программную логику.


⇐ Предыдущая страница| |Следующая страница ⇒