Для того, чтобы наш объект мог принимать значение
NULL, необходимо реализовать интерфейс INullable. Этот интерфейс определяет
единственное read-only свойство bool IsNull. Все классы из System.Data.SqlTypes
реализуют этот интерфейс. В нашем примере объект принимает значение NULL при
инициализации, и перестает быть Null сразу, как только ему будет передано
не-NULL значение в метод Accumulate или Merge.
Пользовательские типы данных
Систему типов SQL Server можно расширить с помощью
пользовательских типов данных (User-defined Types, UDT). Пользовательские типы
реализуются как управляемый класс на любом из CLR-языков и регистрируются в SQL
Server. Такой тип можно использовать для определения типа колонки в таблице, или как переменную (параметр процедуры) в выражении Т-SQL. При этом методы
объектов можно вызывать прямо из T-SQL.
Создание пользовательского типа данных
В T-SQL пользовательский тип данных регистрируется при
помощи оператора CREATE TYPE:
CREATE
TYPE [ type_schema_name. ] type_name
FROM base_type [ ( precision [ , scale ] )
В операторе указывается имя класса из предварительно
загруженной в базу сборки.
Альтернативой прямому использованию T-SQL, как и в
других случаях, служит автоматическое развертывание проектов MS Visual Studio
.Net Whidbey. Классы, помеченные атрибутом SqlUserDefinedType (мы подробно
рассмотрим его чуть позже – при обсуждении сериализации) автоматически
регистрируются в качестве пользовательских типов при развертывании проектов
типа SQL Server Project.
Для того, чтобы класс .NET можно было использовать в
качестве пользовательского типа данных SQL Server, он должен выполнять
некоторые обязанности:
Иметь конструктор без параметров. Как правило, он
возвращает экземпляр, соответствующий значению NULL (об этом далее).
Поддерживать NULL-значения. Класс должен реализовывать
интерфейс INullable, который описан в предыдущем разделе. Также необходима
реализация в классе статического свойства Null, которое возвращает NULL-объект
этого класса, т.е. должно быть MyClass.Null.IsNull == true. Все методы должны
корректно обрабатывать передачу в параметрах как экземпляра Null, так и
значения null.
Поддерживать конверсию в строку и обратно: в классе
должен быть определен метод Parse(SqlString s) и должным образом перекрыт метод
ToString().
Поддерживать сериализацию. Поскольку объекты этого
класса будут храниться на диске, необходимо обеспечить преобразование в
«плоский» формат (а также восстановление).
Сериализация является настолько существенной частью
поведения пользовательских типов, что ей посвящен отдельный подраздел этой
статьи. А пока что мы попробуем создать свой несложный тип данных.
В качестве упражнения я реализовал тип «точка на
плоскости». Он умеет представлять свои координаты как в декартовых, так и в
полярных координатах.
using System;
using System.Data.Sql;
using System.Data.SqlTypes;
using System.Text.RegularExpressions;
using System.Runtime.InteropServices;
[Serializable]
[SqlUserDefinedType(Format.Native)]
[StructLayout(LayoutKind.Sequential)]
public class SqlPoint: INullable
Рекомендуем скачать другие рефераты по теме: диплом государственного образца, реферат по экологии.