Как нетрудно заметить, никакого атрибута методу
AnotherTrigger не назначено – мы регистрируем его вручную. Кстати, еще одним
преимуществом триггеров на .NET-языках по сравнению с T-SQL является
возможность назначить одно и то же тело на различные объекты.
Информация к размышлению
Я включил в этот раздел результаты некоторых
экспериментов с MS SQL Server Yukon, которые не очень хорошо вписываются в
общую структуру статьи.
Yukon и Generics
Одним из наиболее интересных нововведений в .NET 1.2
являются Generic-и. Они позволяют облегчить повторное использование кода, вместе с тем повышая надежность приложений.
Поскольку программирование под Yukon требует именно
этой версии .NET, логично поинтересоваться перспективами использования в нем
данного новшества.
Увы, напрямую использовать Generic-тип в Yukon нельзя.
В одном из своих первых экспериментов я пытался создать обобщенную агрегирующую
функцию. Такой подход кажется вполне логичным – многие агрегирующие функции
естественным образом обобщаются на произвольные типы данных. В примере, который
я привел в данной статье, функция AvgGeom принимает и возвращает SqlDouble. При
ее применении к числам с фиксированной запятой возникают ненужные накладные
расходы на преобразование типов во время выполнения запроса. Писать же по
версии этой функции для каждого числового типа – расточительно и просто скучно.
Однако, попытка зарегистрировать generic-класс в
качестве агрегирующей функции не удалась. Такие классы Yukon просто «не видит».
Это, в общем-то, логично – насколько мне известно, обязанность генерации
«окончательного» класса по его generic-прототипу лежит на компиляторе. А его-то
как раз в сервере нет! Поэтому использование конструкций вида
GenericType<SQLDecimal> в параметре EXTERNAL NAME любого из операторов
CREATE лишено смысла.
Следующим шагом стала попытка предоставить серверу
обычный класс, унаследованный от специализированной generic-реализации. Увы, это тоже не привело к успеху – сервер «не видит» публичные унаследованные
методы. Последним ударом в этот бубен стала такая попытка:
public
new void Init()
{
base.Init();
}
Это был фактически жест отчаяния – уже необходимость
специализировать класс для каждого типа аргументов убивает всю красоту
обобщенного программирования. А уж написание рутинного кода лишь немногим лучше
содержания зоопарка функций-близнецов. Получившийся в итоге класс удалось, наконец, «протащить» сквозь регистрацию. К сожалению, пользы от этого было
немного – при попытке использовать функцию в запросе сервер нашел оба метода и
пожаловался на неоднозначность.
ПРИМЕЧАНИЕ
В данный момент это выглядит как
простая недоработка. Возможно, это поведение будет исправлено в финальной
версии.
Кстати, обратите внимание, что необходимая
функциональность класса агрегирующей функции не выражена в терминах какого-либо
интерфейса – это связано именно с тем, что типы параметров могут меняться. В
терминах generic можно было бы выразить этот гипотетический интерфейс примерно
так:
public
interface IAggregating<input_type, return_type> : INullable
Однако разработчики Yukon проигнорировали эту
возможность. В итоге, пригодность класса для реализации агрегирующей функции
проверяется только на этапе его регистрации в базе данных.
Yukon и ООП
Перспектива внедрения .NET-кода в SQL Server
заинтересовала меня в первую очередь возможностями ООП, которого так остро
порой не хватает в RDBMS. Однако радость моя оказалась преждевременной – из
инкапсуляции, наследования и полиморфизма поддерживается только первая
парадигма. Наследование и полиморфизм приходится оставить «за дверью», т.е. по
ту сторону оператора CREATE ASSEMBLY.
Во-первых, в Yukon типы совместимы только сами с собой
и с binary. Это означает, что если колонка в таблице продекларирована как
TypeA, то никаких наследников этого типа туда положить нельзя. Увы. При
регистрации в базе отношения между классами исчезают.
Во-вторых, полиморфизм в смысле виртуальных методов подразумевает
поддержку наследования, а ее-то как раз и нету. То есть виртуальные методы в
Yukon ничем не лучше невиртуальных. Даже самый тоталитарный вариант
полиморфизма – перегрузка методов – не работает. В пользовательском типе нельзя
использовать более одного публичного члена с заданным именем (то есть иметь
можно, но попытка обращения к нему приведет к ошибке).
Yukon и индексеры
Рекомендуем скачать другие рефераты по теме: диплом государственного образца, реферат по экологии.