Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Разработка приложений баз данных (Visual Studio 2008).docx
Скачиваний:
143
Добавлен:
26.03.2016
Размер:
1.01 Mб
Скачать

ОбъектыDataRelationи ограничения

Объект DataRelation также используется для создания и введения следующих ограничений:

  • Ограничение уникальности, которое гарантирует, что столбец таблицы не содержит дублирующихся значений.

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

Ограничения, заданные в объекте DataRelation, реализуются посредством автоматического создания соответствующих объектов или настройки свойств. При создании ограничения внешнего ключа с помощью объектаDataRelationэкземпляры классаForeignKeyConstraintдобавляются в свойствоChildKeyConstraintобъектаDataRelation.

Ограничение уникальности реализуется либо присвоением свойству Uniqueстолбца данных значения true, либо добавлением экземпляра классаUniqueConstraintв свойствоParentKeyConstraintобъектаDataRelation. Сведения о приостановке ограничений в наборе данных см. в разделеПрактическое руководство. Отключение ограничений при заполнении набора данных.

Правила целостности данных

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

  • При обновлении родительской записи

  • При удалении родительской записи

  • При принятии или отклонении изменения

Правила, которые можно задать, определены в перечислении Ruleи представлены в следующей таблице.

Правило ограничения внешнего ключа

Действие

Cascade

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

SetNull

Дочерние записи не удаляется, но внешний ключ в дочерних записях устанавливается в DBNull. С этим параметром дочерние записи могут остаться "потерянными объектами", т. е. не иметь отношений с родительскими записями.

Примечание.

В результате использования данного правила в дочерней таблице могут содержаться неправильные данные.

SetDefault

Внешнему ключу в связанных дочерних записях присваивается значение по умолчанию (как было определено свойством DefaultValue столбца).

None

В дочернюю запись не вносятся никакие изменения. С этой настройкой дочерние записи могут содержать ссылки на неверные родительские записи.

Отношения, используемые только для ограничений

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

Навигация в DataRelations (ado.Net)

Одно из основных назначений объекта DataRelationсостоит в обеспечении переходов от одного объектаDataTableк другому в пределахDataSet. Это позволяет получать все связанные объектыDataRowв одном объектеDataTableпри указании единственного значенияDataRowиз связанного объектаDataTable. Например, после установления связиDataRelationмежду таблицей заказчиков и таблицей заказов можно получить все строки с заказами для конкретной строки заказчика с помощью методаGetChildRows.

Можно использовать объект DataRelationдля поиска связанных записей путем вызова методаGetChildRowsклассаDataRowв родительской таблице; этот метод возвращает массив связанных дочерних записей. Или можно вызвать методGetParentRowклассаDataRowв дочерней таблице; этот метод возвращает однуDataRowиз родительской таблицы.

Ниже приведена таблица со списком перегрузки Метода GetChildRows.

Имя

Описание

GetChildRows(DataRelation)

Получает дочерние строки этого объекта DataRowс помощью указанного объектаDataRelation.

GetChildRows(String)

Получает дочерние строки объекта DataRowс помощью указанного свойстваRelationNameобъектаDataRelation.

GetChildRows(DataRelation, DataRowVersion)

Получает дочерние строки объекта DataRowс помощью указанных объектовDataRelationиDataRowVersion.

GetChildRows(String, DataRowVersion)

Получает дочерние строки объекта DataRowс помощью указанного свойстваRelationNameобъектовDataRelationиDataRowVersion.

Ниже приведена таблица со списком перегрузки Метода GetParentRows.

Имя

Описание

GetParentRows(DataRelation)

Получает родительские строки объекта DataRowс помощью указанного объектаDataRelation.

GetParentRows(String)

Получает родительские строки объекта DataRowс помощью указанного свойстваRelationNameобъектаDataRelation.

GetParentRows(DataRelation, DataRowVersion)

Получает родительские строки объекта DataRowс помощью указанных объектовDataRelationиDataRowVersion.

GetParentRows(String, DataRowVersion)

Получает родительские строки объекта DataRowс помощью указанного свойстваRelationNameобъектовDataRelationиDataRowVersion.

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

Для возврата дочерних записей выбранной родительской записи следует вызвать метод GetChildRows определенной строки данных Suppliers, чтобы возвратить массив строк изDataTableGoods:

Язык C#

string suppl = "1";

SuppliersGoods.GoogsRow[] goods;

goods = (SuppliersGoods.GoodsRow[])SuppliersGoods.Suppliers.

FindByCodeSuppliers(suppl).GetChildRows("SuppliersGoodsRelation");

MessageBox.Show(goods.Length.ToString());

Для возврата родительской записи для выбранной дочерней записи следует вызвать метод GetParentRowопределенной строкиDataTableGoods, чтобы возвратить одну строку изDataTableSuppliers:

Язык C#

int goodsID = 10707;

SuppliersGoods.SuppliersRow supplier;

supplier = (SuppliersGoods.SuppliersRow) SuppliersGoods.Goods.

FindByCodeGoods(goodsID).GetParentRow("SuppliersGoodsRelation");

MessageBox.Show(customer.CompanyName);

В следующем примере кода создается связь DataRelationмежду таблицейSuppliersи таблицейGoodsнабора данныхDataSetи возвращаются все заказы для каждого заказчика.

Язык C#

static DataSet SuppliersGoods = new DataSet();

DataRelation SuppliersGoodsRelation =

SuppliersGoods.Relations.Add("SupGoods",

SuppliersGoods.Tables["Suppliers"].Columns["CodeSuppliers"],

SuppliersGoods.Tables["Goods"].Columns["CodeGoods"]);

foreach (DataRow SuppliersRow in SuppliersGoods.Tables["Suppliers"].Rows)

{

Console.WriteLine(custRow["CodeSuppliers"].ToString());

foreach (DataRow GoodsRow in SuppliersRow.GetChildRows(SuppliersGoodsRelation))

{

Console.WriteLine(orderRow["CodeGoods"].ToString());

}

}