Эта процедура превращает данные в таблице изменения
курсов некой валюты (Course) в таблицу ежедневных значений курса, повторяя
предыдущее значение для тех дней, в которые изменений не происходило.
На этот раз у процедуры есть параметры. Чтобы помочь
инструментам автоматического развертывания (например, той же MS VS Whidbey)
определить SQL-типы параметров хранимой процедуры, для параметров метода можно
указать атрибут SqlMapping (System.Data.Sql.SqlMappingAttribute). Его
единственный параметр и задает тип для параметра процедуры. В данном случае
этот атрибут является избыточным – параметры типа DateTime автоматически
отображаются в тип SQL datetime (которому соответствует тип CLR
System.Data.SqlTypes.SqlDateTime), но в более сложных случаях им придется
пользоваться для устранения неоднозначности.
Чтобы выполнить запрос к данным сервера, мы
воспользуемся еще одним статическим методом класса SqlContext –
SqlContext.GetCommand().
Чтобы возвратить данные клиенту, нужен экземпляр
класса, реализующего интерфейс System.Data.Sql.ISqlRecord. В данном случае
использован System.Data.Sql.SqlDataRecord. Его конструктор требует указать
желаемую структуру записи. Эта структура описывается массивом объектов класса System.Data.Sql.SqlMetaData.
В каждом объекте задается имя и тип соответствующей колонки. Мы описываем
структуру, соответствующую в терминах SQL вот такой «таблице»:
(
D datetime,
course decimal(10, 4)
)
Создав запись, мы инициируем процесс отправки при помощи
вызова:
pipe.SendResultsStart(rec, false);
Второй параметр говорит о том, что саму запись
отправлять клиенту не нужно; вместо этого метаданные записи используются для
инициализации отправляемого набора записей.
Дальше все просто – мы читаем очередную запись из
SqlDataReader, полученного в результате исполнения команды, заполняем поля в
SqlDataRecord, и отправляем ее клиенту. Дополнительный цикл в конце досылает
записи для дат между последним изменением и концом запрошенного интервала.
Отправив все, что хотелось, мы сигнализируем клиенту
об окончании набора при помощи вызова
pipe.SendResultsEnd();
Стоит отметить, что результаты возвращаются напрямую
клиенту, т.е. код, который вызвал процедуру, не имеет над этим процессом
никакого контроля. Повторное использование такого кода в серверной части
приложения маловероятно. В следующем разделе мы узнаем о том, как можно обойти
это ограничение.
Функции
В рамках T-SQL функции делятся на два вида: скалярные
и табличные.
ПРИМЕЧАНИЕ
Есть еще агрегатные функции, но их
реализация существенным образом отличается от «обычных», и поэтому мы
рассмотрим их в следующем разделе.
С точки зрения .NET, эти два типа функций устроены
почти одинаково. Как и хранимые процедуры, они реализуются при помощи
статических методов класса. Отличие заключается в том, как они возвращают
значения. Есть три варианта:
Возвращаем значение произвольного типа. Это скалярная
функция.
Рекомендуем скачать другие рефераты по теме: диплом государственного образца, реферат по экологии.