Эта процедура превращает данные в таблице изменения
курсов некой валюты (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, и отправляем ее клиенту. Дополнительный цикл в конце досылает
записи для дат между последним изменением и концом запрошенного интервала.
Отправив все, что хотелось, мы сигнализируем клиенту
об окончании набора при помощи вызова
Стоит отметить, что результаты возвращаются напрямую
клиенту, т.е. код, который вызвал процедуру, не имеет над этим процессом
никакого контроля. Повторное использование такого кода в серверной части
приложения маловероятно. В следующем разделе мы узнаем о том, как можно обойти
это ограничение.
Функции
В рамках T-SQL функции делятся на два вида: скалярные
и табличные.
ПРИМЕЧАНИЕ
Есть еще агрегатные функции, но их
реализация существенным образом отличается от «обычных», и поэтому мы
рассмотрим их в следующем разделе.
|
С точки зрения .NET, эти два типа функций устроены
почти одинаково. Как и хранимые процедуры, они реализуются при помощи
статических методов класса. Отличие заключается в том, как они возвращают
значения. Есть три варианта:
Возвращаем значение произвольного типа. Это скалярная
функция.
Рекомендуем скачать другие рефераты по теме: диплом государственного образца, реферат по экологии.
Предыдущая страница реферата |
3
4
5
6
7
8
9
10
11
12
13 |
Следующая страница реферата