Объект DataLink

Объект DataLink представляет описатель связи типа геометрии с таблицей ГБД/внешней БД или каталогизированной выборкой внешней БД. Для установки связи необходимо создать объект DataLink с помощью метода FeatureType::CreateDataLinkForTable или FeatureType::CreateDataLinkForQuery, настроить созданный описатель связи и поместить его в коллекцию FeatureType::DataLinks. Для устранения связи необходимо удалить описатель связи из коллекции FeatureType::DataLinks.

Если устанавливается связь типа геометрии с таблицей ГБД/внешней БД, описатель связи создается с помощью метода FeatureType::CreateDataLinkForTable. Аргументом метода является связываемая таблица (объект Table). Недопустимо использовать в качестве связываемой таблицы временную таблицу ГБД. Если связь устанавливается с каталогизированной выборкой внешней БД, описатель связи следует создать с помощью метода FeatureType::CreateDataLinkForQuery. Аргументом метода является связываемая выборка (объект Query). После создания описателя связи и перед его добавлением в коллекцию FeatureType::DataLinks необходимо осуществить настройку описателя связи:

С помощью свойства DataLink::LinkCategory установить характеристику связи. Описание характеристик связи приведено в таблице "Характеристики связи типа геометрии с таблицей/выборкой". В таблице описаны также ограничения на установку характеристики связи и возможности изменения характеристики связи после добавления объекта DataLink в коллекцию FeatureType::DataLinks.

В случае прямой связи (константа характеристики связи - gdbLinkDirect) необходимо установить поле прямой связи с помощью свойства DataLink::DirectField. Поле прямой связи должно принадлежать таблице/каталогизированной выборке внешней БД, на основе которой построен описатель соединения. Поле должно быть целочисленным и иметь точность не менее 10 десятичных цифр (точность поля можно определить с помощью свойства Field::Precision). Поле прямой связи предназначено для хранения внутреннего номера геометрий заданного типа. Связь геометрий с записями таблицы/выборки осуществляется по значению данного поля.

В случае косвенной связи (константа характеристики связи - gdbLinkIndirect) необходимо установить таблицу переадресации с помощью свойства DataLink::CrossTable. Таблица переадресации должна быть постоянной таблицей ГБД и иметь уникальную характеристику связи с типом геометрий – владельцем описателя связи (константа характеристики связи - gdbLinkUniq). Недопустимо использовать в качестве таблицы переадресации временную таблицу ГБД.

В случае косвенной связи (константа характеристики связи - gdbLinkIndirect) необходимо полям связываемой таблицы/выборки внешней БД поставить в соответствие поля таблицы переадресации. Для каждой пары полей (поле таблицы/выборки, поле таблицы переадресации) необходимо с помощью метода DataLink::CreateIndirectFieldsPair создать объект IndirectFieldsPair - описатель соответствия полей косвенной связи и поместить его в коллекцию DataLink::IndirectFieldsPairs. Для получения геометрии, связанной с записью таблицы/выборки внешней БД, по значениям полей косвенной связи в записи определяется запись в таблице переадресации, связанная с геометрией. В обратном направлении определяется запись таблицы переадресации, связанная с геометрией, затем по значениям полей косвенной связи в записи таблицы переадресации определяется запись (записи) таблицы/выборки внешней БД.

Прямая связь таблицы/выборки внешней БД с типом геометрий более эффективна, чем косвенная связь, однако, следует учитывать, что реорганизация ГБД с изменением внутренних номеров геометрий (с помощью метода GDBEngine::CompactGDB с параметром mode == gdbCompactNoKeepISN) приведет к нарушению связей записей и геометрий. Копирование и перемещение геометрий из одного слоя в другой (в другую карту, другую ГБД) приводит к изменению внутренних номеров геометрий, что также приводит к нарушению связей.

Косвенная связь таблицы/выборки внешней БД с типом геометрий менее эффективна, чем прямая связь, однако она лишена ограничений на способ реорганизации ГБД.