CLRSQL. Делаем библиотеку для SQL SERVER

Всем привет,
сегодня будем делать библиотеку которая будет работать под управлением SQL SERVER.

Вот готовая библиотека Lib1

Что будет делать наша библиотека? Представим у нас, есть задача: нам нужно заливать графические файлы в БД, все ничего, но некоторые файлы иногда обновляются, как следствие нам нужно, скажем раз в день перебирать дату создания файлов в папке и сравнивать ее с датой заливки файла в БД. Решить эту задачу можно с помощью .NET

Итак, поехали.

1) Создаем проект «Class Library» даем название «Lib1»

2) Удаляем namespace, теперь код выглядит так.

3) Создаем класс, который будет выступать в качестве шаблона для результирующего набора табличной функции в Sql Server

class RowItem
{
    public string Name { get; private set; }
    public DateTime CreateDateTime { get; private set; }

    public RowItem(string _name, DateTime _createDateTime)
    {
        Name = _name;
        CreateDateTime = _createDateTime;
    }
}

4) Переименовываем Class1 в MyClass
5) Содержимое класса MyClass

[SqlFunction(FillRowMethodName = "FillRow", 
        TableDefinition = "Name nvarchar(255),CreateDateTime datetime")]
    public static IEnumerable ShowFiles(string dirname)
    {
        List<RowItem> enumResult = new List<RowItem>();
        foreach (var item in Directory.GetFiles(dirname, "*.*", SearchOption.AllDirectories))
        {
            FileInfo file = new FileInfo(item);
            enumResult.Add(new RowItem(file.Name, file.CreationTime));
        }
        return enumResult;
    }

    public static void FillRow(Object obj, out SqlString Name, out SqlDateTime CreateDateTime)
    {
        RowItem row = (RowItem) obj;
        Name = row.Name;
        CreateDateTime = row.CreateDateTime;
    }

Пояснение к коду: UDF(User Defined Functions) состоит из двух методов. Первый (ShowFiles) должен возвращать объект реализующий в себе интерфейс IEnumerable. Рассматриваем его как «полуфабрикат» таблицы, которая будет возвращаться данной UDF. Объекты – это, условно говоря, ее записи(строки в таблице). Запись представлена классом RowItem. Если не вдаваться в подробности T-SQL-ная UDF отличается от CLR-ной тем, что возвращает результирующий набор сразу, в то время как CLR-ная – это потоковый доступ. Потоковый доступ означает, что всякий раз, когда мы в foreach продвигаемся на Next, дергается второй метод, который в нашем случае называется FillFiles, возвращающий следующую запись. Метод FillFiles имеет в качестве первого параметра объект — это очередной элемент коллекции, т.е. прототип очередной записи(заготовочка), а дальше идут выходные параметры по кол-ву полей результирующего набора, возвращаемого данной пользовательской функцией. Это уже точный набор полей, не полуфабрикатный. Он должен соответствовать структуре таблицы, прописанной в атрибуте TableDefinition метода ShowFiles.

6) Так теперь собираем нашу библиотеку.

7) dll-ка обычно формируется в корне проекта в папке debug

8) Теперь открывает Management Studio, первое что нужно сделать это позволить библиотеке выполняться на среде СУБД для этого выполняем следующий код.

9) Далее, необходимо так сказать убедить SQL Server доверять выполнению сборок расположенных в той или иной БД, в моем случаи БД называется TSQL2012, а вот сам код.

10) Далее, создаем сборку внутри БД, я свою назвал CLRFunction, обратите внимание путь к вашей сборке будет отличаться.

11) Заходит в раздел программирование, ищем нашу сборку, обязательно встаньте на папку Сборка и нажмите F5, сборка должна появиться.

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

13) Проверяем что функция создалась.

14) Теперь создаем папку для примера, и накидываем в нее файлы, я создал папку TestTemp в корне диска C

15) Идем обратно в ManagmentStudio и выполняем функцию, передавая ей путь к папке.

Всё, ставь лайк!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

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