Главная » Microsoft SQL Server, Базы данных » Создание пользовательских типов интеграции CLR – ЧАСТЬ 1

0

Программирование пользовательских типов требует создания полноценного класса или структуры. Как и в других типах интеграции CLR, большая часть программного кода скрыта от разработчика, который должен реализовать только частичный класс, что требует написания одного метода. Проще говоря, требования, выдвигаемые при создании пользовательского типа, не отличаются от тех, которые выдвигаются при создании любого другого класса. К тому же существует значительный список дополнительных требований к созданию, тестированию и использованию пользовательских типов. Очень важно выработать единые соглашения для пользовательского типа, поскольку он будет потенциально использоваться на всех уровнях приложения. Вносить изменения гораздо сложнее, чем тщательно продумать все с самого начала. Отладка и тестирование пользовательского типа добавляют уровень зависимостей данных и сборок .NET, выходящих за пределы типа CLR. Развертывание пользовательского типа требует полного понимания архитектуры среды .NET Framework. Во многих реальных ситуациях требуются манипуляции с глобальным кэшем сборки или, в качестве альтернативы, беспрецедентное объединение уровней приложения и базы данных.

Большинство разработчиков для создания пользовательских типов используют программы Visual Studio 2005 Professional или Team System. В редакциях Standard и Express этой среды разработки не реализованы все функции отладки компонентов интеграции CLR. Также можно создавать и развертывать пользовательские типы с помощью инструментария разработки программ .NET SDK. Этот SDK использует те же специальные компиляторы языков программирования, что и Visual Studio. После компиляции сборка пользовательского типа загружается в SQL Server с помощью инструкций T-SQL CREATE ASSEMBLY и CREATE TYPE, независимо от того, какие инструменты были использованы для написания и компиляции типа. Реальное значение использование интерфейса Visual Studio 2005 приобретает в процессе разработки и отладки. С помощью Visual Studio 2005 разработчик может создавать тестовые сценарии и управлять ими, что позволяет решить массу вопросов развертывания, пока тип не будет готов для тестирования интеграции. Хотя бы только по этой причине программистам, только начинающим работать со средой .NET Framework, рекомендуется использовать интерфейс Visual Studio, а не пытаться одновременно изучить .NET SDK и .NET Framework. Сэкономленное время и повышенное качество программного кода с лихвой окупят средства, потраченные на покупку лицензии Visual Studio 2005.

Дополнительная Все редакции SQL Server 2005 поддерживают интеграцию CLR. Для определе- информация ния того, какая версия ядра базы данных лучше подходит для производствен- !   ‘ ного использования или разработки, сравните характеристики SQL Server с

требованиями, выдвигаемыми производственными условиями. Описание характеристик всех доступных редакций см. в главе 3.

Независимо от того, какие инструменты вы используете, .NET Software Developement Kit (SDK) или Visual Studio 2005, для успешного создания пользовательского типа нужно понять некоторые требования и принять конструктивные решения. Чем должен быть тип: классом или структурой? Как тип будет удовлетворять контракту программирования SQL Server 2005? Какой режим защиты доступа к коду (СAS) необходим для данного типа? Какой метод использовать для подписания сборки? Как управлять развертыванием на всех уровнях приложения?

Дополнительная Варианты подписания сборки .NET и режимы защиты CAS см. в главе 27.

информация

Пренебрежение тщательным рассмотрением данных вопросов может создать Внимание! клубок зависимостей, который будет тяжело распутать. Например, в базе данных тип нельзя изменить, если он используется в таблице, а на уровне приложения структура типа должна в точности соответствовать его структуре, используемой в базе данных. Внесение изменений в пользовательский тип может потребовать, чтобы данные из соответствующих столбцов были сохранены, а сам столбец удален (так как не существует инструкции alter type). После этого новое определение типа должно быть загружено в базу данных, данные перемещены в новые столбцы, а ссылки в приложении на данный тип обновлены. Только после этого работа приложения может быть продолжена. Естественно, некоторые измененные части могут потребовать восстановления. Сбои приложения более вероятны, если одна из частей не была корректно модифицирована.

Удовлетворение требований

Создание и использование пользовательских типов интеграции CLR требуют наличия SQL Server 2005 и среды .NET Framework версии 2.0. Реализации пользовательских типов не имеют обратной совместимости. Пользовательские типы не могут быть использованы, и на них не могут содержаться ссылки в любых предыдущих версиях .NET Framework. Пользовательские типы могут существовать в приложениях .NET без наличия манифеста в базе данных, хотя требования при этом несколько изменяются. Несмотря на отдаленное сходство с типами VB6, которые могут объявляться в процедуре, со старыми псевдонимами типов SQL Server, пользовательские типы интеграции CLR должны объявляться как структура или класс VB.NET.

Причины того, почему для большинства пользовательских типов используют структуры, можно найти в самом фундаменте среды .NET Framework. Структура имеет тип значения, а класс — тип ссылки. Структура размещается в стеке вызова, а класс — в куче объекта. Эти, на первый взгляд, незначительные отличия предопределяют некоторые существенные различия в поведении классов и структур. Собранные вместе, эти отличия выливаются в относительно большой объем работы при программировании типов ссылок или классов. В табл. 29.1 перечислены некоторые отличия между структурой и классом в среде .NET Framework.

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

?               Управление сроком жизни. Можно рассматривать как достоинство то, что один процесс может создать экземпляр пользовательского типа, а другой — ссылаться на него даже после завершения процесса создателя. Например, заголовок управляющего пакета или структура идентификации родословной могут сохраняться в памяти на протяжении выполнения пакета или итерации.

Таблица 29.1. Сравнение структур и классов VB.NET

Структура

Класс

Тип объявления

Значение

Ссылка

Размещение в памяти

Стек программы

Куча объекта

Минимальное количество членов

1

0

Обязательное количество защищенных членов

1

0

Конструктор

Конструктор по умолчанию недопустим. Члены инициализируются в значения по умолчанию

Конструктор по умолчанию обязателен (он используется для создания нового экземпляра)

Ограничения модели доступа

Защищенные члены недопустимы

Нет ограничений

События

Только общие (в языке C# статические) процедуры могут быть обработчиками событий

Обработчиком событий может быть любой метод

Откуда наследуется

Из System.ValueType

Из любого класса, кроме

System.ValueType

Может ли иметь наследников

Нет

Да, если явно не объявлено

NotInheritable

Полиморфизм

Для реализации интерфейса необходима упаковка (преобразование в тип ссылки)

Контракт программирования основанного на наследовании объекта поддерживает интерфейсы

Срок жизни

Не может существовать независимо

Существует, пока достижим

Уборка мусора

Нет. Экземпляры являются копиями, а не ссылками. Основывается на классе контейнера для уборки мусора

Да. Финализируется, когда не остается активных ссылок

Присвоение

При присвоении копируется (по значению)

Клонирование объекта (по ссылке)

При отсутствии присвоения

Члены доступны

Члены недоступны

Изоляция изменений

Экземпляр изолирован

Изменения влияют на другие ссылки

Равенство

Сравниваются отдельные члены

Для сравнения объектов используется метод Equals

?               Полиморфизм. Даже несмотря на то, что в SQL Server не поддерживается наследование, если пользовательский тип управляется несколькими базовыми классами, то наследование может быть использовано с помощью интерфейсов управляемого класса пользовательского типа. В этом случае нагрузка на структуру в стеке будет выше нагрузки на класс в куче, поэтому тип значения будет упаковываться. Упаковка результата в копии значения обслуживается как в стеке программы, так и в куче объекта.

?               Наследование. Если модель программирования имеет основания создать базовый пользовательский тип, из которого будут управляться другие типы, это может быть реализовано только с помощью класса. Структуры не поддерживают наследование.

?               Базовые типы объектов в пользовательском типе. Если член пользовательского типа имеет тип ссылки, такой как string, то ссылка на него потребует создания объекта в куче объекта. Если тип создается как структура, то пользовательский тип будет создан в куче, но он будет содержать ссылку на этого члена объекта. Редко используемый член может быть инициализирован как nothing, что позволит лучше сохранить структуру типа значения. Часто используемый член менее вероятно сможет воспользоваться какими-либо преимуществами типа значения, которое существует в программном стеке.

Источник: Нильсен, Пол. Microsoft SQL Server 2005. Библия пользователя. : Пер. с англ. — М. : ООО “И.Д. Вильямс”, 2008. — 1232 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии