К основному контенту

Моя первая CLR процедура

Недавно мне пришлось решать следующую задачу: объединить данные, полученные из Web API с результатами sql запроса, а готовый результирующий сет использовать в sql-процедуре.

Для решения этой задачи я обратился к CLR процедурам. CLR процедуры - это хранимые  процедуры, выполняемые на SQL-сервере, но написанные на языке C#. CLR процедуры компилируются в отдельную dll и добавляются в SQL-сервер.

Чтобы написать свою первую CLR процедуру, я создал новый проект и назвал его SqlServerProject. В качестве шаблона выбрал CLR Database Project.
При создании проекта появилось диалоговое окно с просьбой привязать базу данных. Я указал базу данных, где планировал разворачивать CLR процедуру. Для CLR процедуры необходимо указать уровень доступа. Существует три варианта доступа: Safe, External, Unsafe. Подробное об ограничениях доступа можно почитать здесь. Для своего проекта я выбрал External, так как для моей процедуры требуется доступ в интернет.

В проекте я создал файл с именем StoredProcedure.cs Процедура получает на вход имя города, делает GET запрос к внешнему API, и возвращает таблицу c Id города. Важно: у класса должен быть атрибут SqlProcedure.

Код файла привожу ниже:

namespace SqlServerProject
{
    public class StoredProcedures
    {
 
        /// <summary>
        /// Процедура получает Id города
        /// </summary>
        /// <param name="cityName">Название города</param>
        [SqlProcedure]
        public static void GetCityName(SqlString cityName)
        {
            try
            {
                //Делаем GET запрос к Web API
                var reqGet = WebRequest.Create("http://apiUrl");
 
                var response = reqGet.GetResponse();
 
                var stream = response.GetResponseStream();
 
                if (stream == nullreturn;
 
                var sr = new StreamReader(stream);
 
                //Читаем данные, полученные от API
                var cityIdString = sr.ReadToEnd();
 
                var cityId = 0;
 
                if(int.TryParse(cityIdString, out cityId))
                {
                    //Создаем заголовок результирующей таблицы 
                    //и определяем тип возвращаемых данных
                    var record = new SqlDataRecord(
                        new SqlMetaData("CityId"SqlDbType.Int));
 
                    //Открываем запись данных
                    SqlContext.Pipe.SendResultsStart(record);
 
                    //Привсваиваем нашей записи значение города. 0 - это позиция 
                    //в записи для случая если результирующая таблица содержит 
                    //более чем 1 колонку
                    record.SetSqlInt32(0, cityId);
                    //Добавляем запись в результирующий сет
                    SqlContext.Pipe.SendResultsRow(record);
 
                    //Закрываем и отправляем клиенту
                    SqlContext.Pipe.SendResultsEnd();
                }
 
            }
            catch (Exception exception)
            {
                //Обрабатываем ошибки
                var record = new SqlDataRecord(new SqlMetaData("Exception"SqlDbType.NVarChar, 512));
                record.SetString(0, exception.Message);
                // Send the record to the client.
                SqlContext.Pipe.Send(record);
            }
 
        }
    };
}

Теперь нажимаем Deploy на проекте и наша процедура разворачивается на SQL-сервере. Обращаться к процедуре нужно по имени класса

EXEC [dbo].GetCityName 'Москва'

Отмечу, что при работе c CLR процедурами столкнулся с проблемой XML-сериализации. Об этой проблеме и способе ее решения напишу в следующий раз.

Комментарии

Отправить комментарий

Популярные сообщения из этого блога

Пример взаимодействия с Odnoklassniki Rest API на C#.

Итак, как и обещал, продолжаю тему взаимодействия с различными API. В прошлый раз писал про  API ВКонтакте , сегодня напишу про API Одноклассников. Первое, что нам нужно сделать - это зарегистрироваться как разработчик на Одноклассниках. Сделать это можно по следующей ссылке  Форма регистрации разработчика приложений Получив права разработчика, необходимо зарегистрировать сайт как приложение. Подробно как это сделать можно прочитать  здесь После того как сайт будет зарегистрирован придет письмо, содержащее: Application ID: xxxxxx. Публичный ключ приложения: xxxxxxxxxxxxxxxxxxxxxxxxx. Секретный ключ приложения:  xxxxxxxxxxxxxxxxxxxxxxxxx. Ссылка на приложение: http://www.odnoklassniki.ru/games/xxxxx Используя эти данные можно начать работу с API. Для выполнения запросов к API пользователь должен авторизоваться в Одноклассниках. Добавляем на нашем сайте ссылку для авторизации пользователя: http://www.odnoklassniki.ru/oauth/authorize?client_id={0}&scope={1}&

C# и API ВКонтакте. Обращение к адресу API-сервиса путем создания HTTP-запроса (POST)

В статье  C# POST. Отправляем запросы на адрес стороннего сервера  я рассказал про метод, с помощью которого можно работать с различным API, принимающими POST запрос и возвращающими ответ в виде json или xml. Сегодня я хочу написать, как я применял этот метод при работе с API  ВКонтакте. Для примера возьму задачу получения через API списка групп, в которых состоит пользователь. В первую очередь необходимо зарегистристрировать наш сайт как приложение ВКонтакте. Заходим по ссылке  http://vk.com/editapp?act=create&site=1  и подключаем наш сайт. Дальше задача  делится на две подзадачи, а именно: авторизация пользователя и обращение к API для получения списка групп. Для авторизации мы пользователю предлагаем перейти по следующей ссылке: http://api.vkontakte.ru/oauth/authorize? response_type=code&redirect_uri={0} &client_id={1} &scope={2} &display=page , redirect_uri - адрес страницы нашего сайта, куда будет возвращен пользователь после авторизации Вконтак

IIS (Internet Information Services) и applicationHost.config. Изменение доменных привязок.

Сегодня затронем тему настроек IIS (Internet Information Services). Речь пойдет о версии IIS 7.0 (7.5). Допустим у вас есть  большое количество поддоменов, которые нужно привязать к сайту или быстро исправить на уже существующих привязках IP адрес. Стандартный интерфейс IIS позволяет редактировать привязки по одной, что в нашем случае не очень-то удобно. См. картинку Чтобы ускорить процесс, нужно вспомнить, что все доменные привязки (и не только, а и другие настройки) хранятся в конфигурационном файле applicationHost.config. Данный файл находится по адресу C:\Windows\System32\inetsrv\config\ В файле отредактировать привязки можно очень быстро.