Программирование >>  Программирование баз данных 

1 ... 162 163 164 [ 165 ] 166 167 168 ... 346


для выборки данных мз внешних источников

using (SqlConnection cn = new SqlConnection( context connection=true )) cn.Open();

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

Теперь мы можем приступить к созданию объекта команды. На самом деле эта задача не представляет собой ничего сложного, поскольку объект команды создается на основе довольно типичного синтаксиса (в реальности объект команды может быть создан с помощью любого обычного способа, если бы это действие осуществлялось с одного из типичных клиентов .NET). Сам автор решил определить свойство CommandText и свойства соединения в составе применяемого им объявления объекта.

Подготовить к использованию простую команду, которая

предназначена для получения данных из двух столбцов

SqlCommand cmd = new SqlCommand( SELECT ©©SERVERNAME, ©@SPID , cn);

После этого мы можем приступить к выполнению команды. Это - одна из тех ситуаций, в которых используются определенные средства, характерные для сборок, поскольку не только вызывается на вьшолнение команда, но и дается явное указание, что нужно продолжить работу и передать эту команду клиенту.

В отличие от хранимых процедур, основанных на языке T-SQL, по умолчанию вызываемые на вьшолнение запросы не обозначаются как передаваемые клиенту. Вместо этого принимается предположение, что пользователь желает организовать локальную обработку результирующего набора. В конечном итоге в связи с этим приходится явно вызывать команду, чтобы отправить что-либо клиенту.

Объектом, осуществляющим это действие, является объект . Pipe, находящийся в контексте SqlContext.

в следующем операторе фактически передается строка, предназначенная для выборки. Если бы потребовалось передать несколько строк, эта задача также оказалась бы разрешимой SqlContext.Pipe.ExecuteAndSend(cmd);

Наконец, но не в последнюю очередь, происходит присваивание значения выходной переменной. В рассматриваемой процедуре фактически с таким присваиванием не связаны какие-либо особые действия, но в саму процедуру введен определенный код, позволяющий узнать, как на самом деле работает эта процедура.

Выходное значение выбрано произвольно. Вместо этого можно было бы передать любые другие данные, в том числе расчетные значения в определенной форме, но в данном случае просто демонстрируются возможности передачи данных в вызывающий код outval = 12345;

После этого достаточно просто скомпоновать проект, и полученная нами первая сборка будет готова для выгрузки на SQL Server. В одном из следующих разделов этой главы будет показано, как определить сборку, предназначенную для использования в качестве хранимой процедуры.



Выгрузка сборки на SQL Server

В названии этого раздела нет ошибки, поскольку для передачи сборки на сервер действительно используется термин выгрузка. При создании сборки в программном обеспечении SQL Server создаются одновременно и копия соответствующей библиотеки DLL в SQL Server, и своего рода дескриптор, который определяет сборку и связанные с ней разрешения.

create assembly <assembly name> [ authorization <owner name> ]

from { <client assembly specifier> <assembly bits> [ ,...n ] } [ with permission set = { safe external access unsafe } ] [ ; ]

Та часть команды создания сборки, которая содержит ключевое слово CREATE, имеет стандартную структуру CREATE <object type> <object name>, применяемую для создания любых объектов с помощью языка SQL. Другие опции приведенной выше синтаксической стр)тстуры рассматриваются в табл. 14. L

Таблица 14.1. Дополнительные опции синтаксической структуры оператора создания сборки

Опция Описание

authorization Опция authorization определяет имя пользователя, который

рассматривается как владелец создаваемой сборки. Если соответствующий параметр не задан, то владельцем считается текущий пользователь. Имя владельца сборки может служить в качестве псевдонима для пользователя с соответствующими правами доступа к сети, что позволяет выполнять любые действия с файлами, определяемые сборкой

from Опция from опредоляет полностью уточненный путь к физическому

файлу библиотеки DLL. В качестве имени пути может применяться либо обозначение локального файла, либо обозначение пути UNO. При желании, можно также предоставить фактическую байтовую последовательность для формирования файла непосредственно из командной строки, а не задавать имя физического файла (автор должен признать, что сам он не пытался опробовать этот вариант)

with PERMissiON set В кэчестве знэчения ОПЦИИ with PERMissiON set могут

применяться следующие три параметра: safe,

external access И unsafe

Параметр SAFE применяется по умолчанию; это равносильно указанию на то, что в создаваемом объекте не используется что-либо, требующее доступа вне процесса SQL Server (иными словами, не применяется доступ к файлам или доступ к внешним базам данных).

Параметр EXTERNAL ACCESS указывает, что для сборки требуется доступ вне процесса SQL Server (к файлам в операционной системе или в пути UNC, или, возможно, к внешнему соединению ODBC/OLEDB).

Параметр UNSAFE свидетельствует о том, что в сборке должен быть предоставлен свободный доступ к пространству памяти SQL Server без учета ограничений управляемого кода CLR. Это означает, что создаваемая сборка в принципе способна нарушить работу СУБД SQL Server, применив недопустимые средства доступа.



Итак, учитывая сказанное, можем приступить к выгрузке сборки: USE AdventureWorks

CREATE ASSEMBLY ExampleProc

FROM <solution path>\ExampleProc\bin\Debug\ExampleProc.dll

При условии, что путь к откомпрыированной библиотеке DLL задан правильно, не должно быть получено никаких сообщений, за исключением типичного сообщения Command(s) completed successfully , и с этого момента появляется возможность создать хранимую процедуру SQL Server, которая ссылается на эту сборку.

Создание хранимой процедуры на основе сборки

с этого момента не должны возниьсать ниьсакие затруднения, поскольку все сложные действия уже выполнены (чтобы ознакомиться с тем, как действительно создается сборка, содержащая код хранимой процедуры, возвратитесь назад на два раздела). Итак, сборка откомпрыирована и выгружена на SQL Server, поэтому мы можем приступить к ее использованию.

Для этого необходимо применить ту же команду CREATE PROCEDURE, которая рассматривалась в главе 11. Но, в отличие от приведенное ранее примера, вместо кода Т-SQL мы применим ссылку на созданную сборку. Напомним, что предназначенный для этого синтаксис выглядит следующим образом:

CREATE PROCEDURE IPROC <sproc name>

[<paramei:er name> [<schema>. ] <data type> [VARYING] [= <default value>] [OUT [PUT]] [ <parameter name> [<scliema>. ] <data type> [VARYING] [= <default value>] [OUT [PUT]] [,

* *]]

[WITH

RECOMPILE] ENCRYPTION [EXECUTE AS { CALLERSELFOWNER<user name>}] [FOR REPLICATION] AS

<code> I EXTERNAL NAME <assembly name>.<assembly class>

Часть приведенного здесь синтаксиса создания хранимой процедуры при использовании сборок мы можем игнорировать. Главные особенности применяемого оператора создания должны быть следующими.

Вместо раздела <code>, который использовался в основной главе, посвященной хранимым процедурам, применяется опция EXTERNAL NAME. Значение EXTERNAL NAME должно быть представлено в следующем формате: <assembly name>.<class name> . <metliod name>

Тем не менее остается необходимость определить все параметры (в том порядке, который соответствует порядку применения параметров в рассматриваемом методе сборки).

Приступим к реализации намеченного замысла применительно к сборке, созданной в предьщущем разделе:

CREATE PROC spCLRExample {

©outval int = NULL OUTPUT

AS EXTERNAL NAME ExampleProc.StoredProcedures.ExampleSP



1 ... 162 163 164 [ 165 ] 166 167 168 ... 346

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.004
При копировании материалов приветствуются ссылки.
Яндекс.Метрика