Поделиться через


Создание хранимых процедур и определяемых пользователем функций с помощью управляемого кода (C#)

Скотт Митчелл

Скачать в формате PDF

Microsoft SQL Server 2005 интегрируется с средой CLR .NET, чтобы разработчики могли создавать объекты базы данных с помощью управляемого кода. В этом руководстве показано, как создать управляемые хранимые процедуры и управляемые пользовательские функции с помощью кода Visual Basic или C#. Мы также видим, как эти выпуски Visual Studio позволяют выполнять отладку таких управляемых объектов базы данных.

Введение

Базы данных, такие как Microsoft SQL Server 2005, используют Transact-язык SQL (T-SQL) для вставки, изменения и получения данных. Большинство систем баз данных включают конструкции для группировки ряда инструкций SQL, которые затем можно выполнять как единую единицу многократного использования. Хранимые процедуры являются одним из примеров. Другое — определяемые пользователем функции (ОПРЕДЕЛЯемые пользователем функции), конструкция, которую мы рассмотрим более подробно на шаге 9.

В основном SQL предназначен для работы с наборами данных. Операторы SELECT, UPDATEи DELETE инструкции, по сути, применяются ко всем записям в соответствующей таблице и ограничиваются только их WHERE предложениями. Тем не менее существует множество функций языка, предназначенных для работы с одной записью за раз и для управления скалярными данными. CURSOR с разрешением на циклику набора записей по одному за раз. Такие функции обработки строк, как LEFT, CHARINDEXи PATINDEX работа с скалярными данными. SQL также включает инструкции потока управления, такие как IF и WHILE.

До Microsoft SQL Server 2005 хранимые процедуры и определяемые пользователем функции можно определить только как коллекцию инструкций T-SQL. Однако SQL Server 2005 был разработан для обеспечения интеграции со средой CLR, которая является средой выполнения, используемой всеми сборками .NET. Следовательно, хранимые процедуры и определяемые пользователем функции в базе данных SQL Server 2005 можно создать с помощью управляемого кода. То есть можно создать хранимую процедуру или UDF в качестве метода в классе C#. Это позволяет использовать эти хранимые процедуры и определяемые пользователем функции в платформа .NET Framework и из собственных пользовательских классов.

В этом руководстве мы рассмотрим, как создавать управляемые хранимые процедуры и определяемые пользователем функции и как интегрировать их в базу данных Northwind. Давайте приступим!

Примечание.

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

Шаг 1. Перемещение базы данных Northwind из App_Data

Все наши учебники до сих пор использовали файл базы данных Microsoft SQL Server 2005 Express Edition в папке веб-приложения App_Data . Размещение базы данных в App_Data упрощенном распределении и выполнении этих учебников, так как все файлы находились в одном каталоге и не требовали дополнительных действий по настройке для тестирования учебника.

Однако в этом руководстве давайте переместим базу данных Northwind из App_Data базы данных Northwind и явно зарегистрируйте ее в экземпляре базы данных SQL Server 2005 Express Edition. Хотя мы можем выполнить действия, описанные в этом руководстве с базой данных в App_Data папке, несколько шагов упрощаются путем явной регистрации базы данных в экземпляре базы данных SQL Server 2005 Express Edition.

Скачивание для этого учебника содержит два файла базы данных — NORTHWND.MDF и NORTHWND_log.LDF — помещены в папку с именем DataFiles. Если вы следуете вместе с собственной реализацией учебников, закройте Visual Studio и переместите NORTHWND.MDF NORTHWND_log.LDF файлы из папки веб-сайта в папку за пределами веб-сайта App_Data . После перемещения файлов базы данных в другую папку необходимо зарегистрировать базу данных Northwind в экземпляре базы данных SQL Server 2005 Express Edition. Это можно сделать из SQL Server Management Studio. Если на компьютере установлен выпуск SQL Server 2005, отличный от Express Edition, скорее всего, уже установлен Management Studio. Если на компьютере есть только SQL Server 2005 Express Edition, скачайте и установите Microsoft SQL Server Management Studio.

Запустите SQL Server Management Studio. Как показано на рисунке 1, Среда Management Studio начинается с запроса на подключение к серверу. Введите localhost\SQLExpress для имени сервера, выберите проверку подлинности Windows в раскрывающемся списке проверки подлинности и нажмите кнопку "Подключить".

Снимок экрана: окно

Рис. 1. Подключение к соответствующему экземпляру базы данных

После подключения окно обозреватель объектов отобразит сведения о экземпляре базы данных SQL Server 2005 Express Edition, включая ее базы данных, сведения о безопасности, параметры управления и т. д.

Нам нужно подключить базу данных Northwind в папке DataFiles (или где бы вы ни могли переместить ее) к экземпляру базы данных SQL Server 2005 Express Edition. Щелкните правой кнопкой мыши папку "Базы данных" и выберите параметр "Присоединить" в контекстном меню. Откроется диалоговое окно "Присоединение баз данных". Нажмите кнопку "Добавить", выполните детализацию до соответствующего NORTHWND.MDF файла и нажмите кнопку "ОК". На этом этапе экран должен выглядеть примерно так же, как на рис. 2.

Снимок экрана: окно

Рис. 2. Подключение к соответствующему экземпляру базы данных (щелкните, чтобы просмотреть изображение полного размера)

Примечание.

При подключении к экземпляру SQL Server 2005 Express Edition через Management Studio диалоговое окно "Присоединение баз данных" не позволяет детализировать каталоги профилей пользователей, например "Мои документы". Поэтому не забудьте разместить NORTHWND.MDF файлы и NORTHWND_log.LDF файлы в каталоге профилей, отличных от пользователей.

Нажмите кнопку "ОК", чтобы подключить базу данных. Диалоговое окно "Присоединение баз данных" закроется, и обозреватель объектов теперь должен перечислить только что подключенную базу данных. Скорее всего, база данных Northwind имеет такое имя 9FE54661B32FDD967F51D71D0D5145CC_LINE ARTICLES\DATATUTORIALS\VOLUME 3\CSHARP\73\ASPNET_DATA_TUTORIAL_75_CS\APP_DATA\NORTHWND.MDF. Переименуйте базу данных в Northwind, щелкнув правой кнопкой мыши базу данных и выбрав "Переименовать".

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

Рис. 3. Переименование базы данных в Northwind

Шаг 2. Создание нового решения и проекта SQL Server в Visual Studio

Чтобы создать управляемые хранимые процедуры или определяемые пользователем функции в SQL Server 2005, мы напишем хранимую процедуру и логику UDF в виде кода C# в классе. После написания кода необходимо скомпилировать этот класс в сборку ( .dll файл), зарегистрировать сборку в базе данных SQL Server, а затем создать хранимую процедуру или объект UDF в базе данных, которая указывает на соответствующий метод в сборке. Эти действия можно выполнить вручную. Можно создать код в любом текстовом редакторе, скомпилировать его из командной строки с помощью компилятора C# (csc.exe), зарегистрировать его в базе данных с помощью CREATE ASSEMBLY команды или из Management Studio, а также добавить хранимую процедуру или объект UDF с помощью аналогичных средств. К счастью, версии Visual Studio профессиональных и team Systems включают тип проекта SQL Server, который автоматизирует эти задачи. В этом руководстве мы рассмотрим тип проекта SQL Server для создания управляемой хранимой процедуры и UDF.

Примечание.

Если вы используете Visual Web Developer или Выпуск Visual Studio уровня "Стандартный", вместо этого вам придется использовать ручной подход. Шаг 13 содержит подробные инструкции по выполнению этих действий вручную. Рекомендуется прочитать шаги 2–12 перед чтением шага 13, так как эти шаги включают важные инструкции по настройке SQL Server, которые должны применяться независимо от используемой версии Visual Studio.

Начните с открытия Visual Studio. В меню "Файл" выберите "Создать проект", чтобы отобразить диалоговое окно "Новый проект" (см. рис. 4). Детализация до типа проекта базы данных, а затем из шаблонов, перечисленных справа, выберите создать проект SQL Server. Я выбрал имя этого проекта ManagedDatabaseConstructs и поместил его в решение с именем Tutorial75.

Создание проекта SQL Server

Рис. 4. Создание нового проекта SQL Server (щелкните, чтобы просмотреть изображение полного размера)

Нажмите кнопку "ОК" в диалоговом окне "Создать проект", чтобы создать решение и проект SQL Server.

Проект SQL Server привязан к определенной базе данных. Следовательно, после создания нового проекта SQL Server мы немедленно просим указать эти сведения. На рисунке 5 показан диалоговое окно "Новая ссылка на базу данных", заполненное для указания базы данных Northwind, зарегистрированной в экземпляре базы данных SQL Server 2005 Express Edition еще на шаге 1.

Связывание проекта SQL Server с базой данных Northwind

Рис. 5. Связывание проекта SQL Server с базой данных Northwind

Чтобы отладить управляемые хранимые процедуры и определяемые пользователем функции, которые мы создадим в рамках этого проекта, необходимо включить поддержку отладки SQL/CLR для подключения. Всякий раз при связывании проекта SQL Server с новой базой данных (как и на рис. 5), Visual Studio просит нас включить отладку SQL/CLR в соединении (см. рис. 6). Щелкните Да.

Включение отладки SQL/CLR

Рис. 6. Включение отладки SQL/CLR

На этом этапе в решение добавлен новый проект SQL Server. Он содержит папку Test Scripts с именем Test.sqlфайла, который используется для отладки объектов управляемой базы данных, созданных в проекте. Мы рассмотрим отладку на шаге 12.

Теперь мы можем добавить в этот проект новые управляемые хранимые процедуры и определяемые пользователем функции, но прежде чем сначала включить существующее веб-приложение в решение. В меню "Файл" выберите параметр "Добавить" и выберите "Существующий веб-сайт". Перейдите к соответствующей папке веб-сайта и нажмите кнопку "ОК". Как показано на рисунке 7, решение обновится для включения двух проектов: веб-сайта и ManagedDatabaseConstructs проекта SQL Server.

Теперь Обозреватель решений включает два проекта

Рис. 7. Теперь Обозреватель решений включает два проекта

Значение NORTHWNDConnectionString в Web.config настоящее время ссылается на NORTHWND.MDF файл в папке App_Data . Так как мы удалили эту базу данных из App_Data экземпляра базы данных SQL Server 2005 Express Edition и явно зарегистрировали ее, необходимо соответствующим образом обновить NORTHWNDConnectionString значение. Web.config Откройте файл на веб-сайте и измените NORTHWNDConnectionString значение, чтобы строка подключения считывал: Data Source=localhost\SQLExpress;Initial Catalog=Northwind;Integrated Security=True После этого изменения раздел <connectionStrings> должен Web.config выглядеть следующим образом:

<connectionStrings>
    <add name="NORTHWNDConnectionString" connectionString=
        "Data Source=localhost\SQLExpress;Initial Catalog=Northwind;
            Integrated Security=True;Pooling=false"
        providerName="System.Data.SqlClient" />
</connectionStrings>

Примечание.

Как описано в предыдущем руководстве, при отладке объекта SQL Server из клиентского приложения, например веб-сайта ASP.NET, необходимо отключить пул подключений. Строка подключения, показанный выше, отключает пул подключений ( Pooling=false ). Если вы не планируете отладку управляемых хранимых процедур и определяемых пользователем пользователей с веб-сайта ASP.NET, включите пул подключений.

Шаг 3. Создание управляемой хранимой процедуры

Чтобы добавить управляемую хранимую процедуру в базу данных Northwind, сначала необходимо создать хранимую процедуру в качестве метода в проекте SQL Server. В Обозреватель решений щелкните правой кнопкой мыши ManagedDatabaseConstructs имя проекта и выберите добавить новый элемент. Откроется диалоговое окно "Добавление нового элемента", в котором перечислены типы объектов управляемой базы данных, которые можно добавить в проект. Как показано на рисунке 8, это включает хранимые процедуры и определяемые пользователем функции, среди прочего.

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

Добавление новой хранимой процедуры с именем GetDiscontinuedProducts.cs

Рис. 8. Добавление новой хранимой процедуры с именем GetDiscontinuedProducts.cs (щелкните, чтобы просмотреть изображение полного размера)

Будет создан новый файл класса C# со следующим содержимым:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
public partial class StoredProcedures
{
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void GetDiscontinuedProducts()
    {
        // Put your code here
    }
};

Обратите внимание, что хранимая процедура реализуется как static метод в partial файле класса с именем StoredProcedures. Кроме того, GetDiscontinuedProducts метод украшен атрибутом, который помечает SqlProcedure attributeметод как хранимую процедуру.

Следующий код создает SqlCommand объект и задает запрос CommandText SELECT , возвращающий все столбцы из Products таблицы для продуктов, поле которых Discontinued равно 1. Затем он выполняет команду и отправляет результаты обратно в клиентское приложение. Добавьте этот код в GetDiscontinuedProducts метод.

// Create the command
SqlCommand myCommand = new SqlCommand();
myCommand.CommandText = 
      @"SELECT ProductID, ProductName, SupplierID, CategoryID, 
               QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, 
               ReorderLevel, Discontinued
        FROM Products 
        WHERE Discontinued = 1";
// Execute the command and send back the results
SqlContext.Pipe.ExecuteAndSend(myCommand);

Все управляемые объекты базы данных имеют доступ к SqlContext объекту , представляющего контекст вызывающего объекта. Предоставляет SqlContext доступ к объекту SqlPipe через его Pipe свойство. Этот SqlPipe объект используется для перенаправки сведений между базой данных SQL Server и вызывающим приложением. Как подразумевает его имя, ExecuteAndSend метод выполняет переданный SqlCommand объект и отправляет результаты обратно в клиентское приложение.

Примечание.

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

Шаг 4. Развертывание управляемой хранимой процедуры

После завершения этого кода мы готовы развернуть его в базе данных Northwind. Развертывание проекта SQL Server компилирует код в сборку, регистрирует сборку в базе данных и создает соответствующие объекты в базе данных, связывая их с соответствующими методами в сборке. Точный набор задач, выполняемых параметром развертывания, более точно определен на шаге 13. Щелкните правой кнопкой мыши ManagedDatabaseConstructs имя проекта в Обозреватель решений и выберите параметр "Развернуть". Однако развертывание завершается сбоем со следующей ошибкой: неправильный синтаксис рядом с "EXTERNAL". Возможно, следует установить более высокий уровень совместимости для текущей базы данных, чтобы включить эту функцию. См. справку по хранимой процедуре sp_dbcmptlevel.

Это сообщение об ошибке возникает при попытке зарегистрировать сборку в базе данных Northwind. Чтобы зарегистрировать сборку в базе данных SQL Server 2005, уровень совместимости базы данных должен иметь значение 90. По умолчанию новые базы данных SQL Server 2005 имеют уровень совместимости 90. Однако базы данных, созданные с помощью Microsoft SQL Server 2000, имеют уровень совместимости по умолчанию 80. Так как база данных Northwind изначально была базой данных Microsoft SQL Server 2000, уровень совместимости в настоящее время имеет значение 80, поэтому необходимо увеличить до 90, чтобы зарегистрировать управляемые объекты базы данных.

Чтобы обновить уровень совместимости базы данных, откройте окно "Создать запрос" в Management Studio и введите следующее:

exec sp_dbcmptlevel 'Northwind', 90

Щелкните значок "Выполнить" на панели инструментов, чтобы запустить приведенный выше запрос.

Обновление уровня совместимости базы данных Northwind

Рис. 9. Обновление уровня совместимости базы данных Northwind (щелкните, чтобы просмотреть изображение полного размера)

После обновления уровня совместимости повторно разверните проект SQL Server. На этот раз развертывание должно завершиться без ошибок.

Вернитесь в SQL Server Management Studio, щелкните правой кнопкой мыши базу данных Northwind в обозреватель объектов и нажмите кнопку "Обновить". Затем разверните папку Programmability и разверните папку Сборок. Как показано на рисунке 10, база данных Northwind теперь включает сборку, созданную проектом ManagedDatabaseConstructs .

Сборка ManagedDatabaseConstructs теперь зарегистрирована в базе данных Northwind

Рис. 10. Сборка ManagedDatabaseConstructs теперь зарегистрирована в базе данных Northwind

Также разверните папку хранимых процедур. Там вы увидите хранимую процедуру с именем GetDiscontinuedProducts. Эта хранимая процедура была создана процессом развертывания и указывает на GetDiscontinuedProducts метод в сборке ManagedDatabaseConstructs . GetDiscontinuedProducts При выполнении хранимой процедуры он, в свою очередь, выполняет GetDiscontinuedProducts метод. Так как это управляемая хранимая процедура, ее нельзя изменить с помощью Management Studio (поэтому значок блокировки рядом с именем хранимой процедуры).

Хранимая процедура GetDiscontinuedProducts указана в папке хранимых процедур

Рис. 11. Хранимая GetDiscontinuedProducts процедура указана в папке хранимых процедур

Перед вызовом управляемой хранимой процедуры необходимо преодолеть еще один барьер: база данных настроена для предотвращения выполнения управляемого кода. Проверьте это, открыв новое окно запроса и выполнив хранимую процедуру GetDiscontinuedProducts . Вы получите следующее сообщение об ошибке: выполнение пользовательского кода в платформа .NET Framework отключено. Включите параметр конфигурации с включенным параметром clr.

Чтобы проверить сведения о конфигурации базы данных Northwind, введите и выполните команду exec sp_configure в окне запроса. В этом примере показано, что параметр clr включен в настоящее время имеет значение 0.

Параметр clr включен в настоящее время имеет значение 0.

Рис. 12. Параметр clr включен в настоящее время имеет значение 0 (щелкните, чтобы просмотреть изображение полного размера)

Обратите внимание, что каждый параметр конфигурации на рис. 12 содержит четыре значения: минимальные и максимальные значения, а также значения конфигурации и запуска. Чтобы обновить значение конфигурации для параметра clr включено, выполните следующую команду:

exec sp_configure 'clr enabled', 1

Если повторно запустить exec sp_configure инструкцию, описанную выше, обновите значение конфигурации параметра clr до 1, но значение выполнения по-прежнему равно 0. Чтобы изменить эту конфигурацию, необходимо выполнить RECONFIGURE команду, которая установит значение запуска для текущего значения конфигурации. Просто введите RECONFIGURE в окно запроса и щелкните значок "Выполнить" на панели инструментов. Если вы запускаете exec sp_configure сейчас, вы увидите значение 1 для параметра конфигурации и запуска среды clr.

После завершения конфигурации с поддержкой clr мы готовы выполнить управляемую хранимую GetDiscontinuedProducts процедуру. В окне запроса введите и выполните команду exec GetDiscontinuedProducts. Вызов хранимой процедуры приводит к выполнению соответствующего управляемого кода в методе GetDiscontinuedProducts . Этот код выдает SELECT запрос для возврата всех продуктов, которые прекращены и возвращают эти данные вызывающей приложению, которое является SQL Server Management Studio в этом экземпляре. Management Studio получает эти результаты и отображает их в окне результатов.

Хранимая процедура GetDiscontinuedProducts возвращает все прекращенные продукты

Рис. 13. Хранимая GetDiscontinuedProducts процедура возвращает все прекращенные продукты (щелкните, чтобы просмотреть изображение полного размера)

Шаг 5. Создание управляемых хранимых процедур, которые принимают входные параметры

Многие созданные в рамках этих учебников запросы и хранимые процедуры используют параметры. Например, в руководстве по созданию хранимых процедур для typed DataSet s TableAdapters мы создали хранимую процедуру с именем GetProductsByCategoryID , которая приняла входной параметр с именем @CategoryID. Затем хранимая процедура вернула все продукты, поле которых CategoryID соответствовало значению предоставленного @CategoryID параметра.

Чтобы создать управляемую хранимую процедуру, принимающую входные параметры, просто укажите эти параметры в определении метода. Чтобы проиллюстрировать это, давайте добавим в проект GetProductsWithPriceLessThanеще одну управляемую хранимую процедуруManagedDatabaseConstructs. Эта управляемая хранимая процедура принимает входной параметр, указывающий цену, и возвращает все продукты, поле которых UnitPrice меньше значения параметра.

Чтобы добавить в проект новую хранимую процедуру, щелкните правой кнопкой мыши ManagedDatabaseConstructs имя проекта и выберите новую хранимую процедуру. Назовите файл GetProductsWithPriceLessThan.cs. Как мы видели на шаге 3, это создаст новый файл класса C# с методом с именем, помещенным GetProductsWithPriceLessThan в partial класс StoredProcedures.

GetProductsWithPriceLessThan Обновите определение метода, чтобы он принял входной SqlMoney параметр с именем price и написать код для выполнения и возврата результатов запроса:

[Microsoft.SqlServer.Server.SqlProcedure]
public static void GetProductsWithPriceLessThan(SqlMoney price)
{
    // Create the command
    SqlCommand myCommand = new SqlCommand();
    myCommand.CommandText =
          @"SELECT ProductID, ProductName, SupplierID, CategoryID, 
                   QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, 
                   ReorderLevel, Discontinued
            FROM Products
            WHERE UnitPrice < @MaxPrice";
    myCommand.Parameters.AddWithValue("@MaxPrice", price);
    // Execute the command and send back the results
    SqlContext.Pipe.ExecuteAndSend(myCommand);
}

Определение GetProductsWithPriceLessThan и код метода тесно похожи на определение и код метода, созданного GetDiscontinuedProducts на шаге 3. Единственное различие заключается в том, что GetProductsWithPriceLessThan метод принимает в качестве входного параметра (), SqlCommand запрос включает параметр (@MaxPriceprice), а параметр добавляется в SqlCommand коллекцию s Parameters и назначается значение переменнойprice.

После добавления этого кода повторно разверните проект SQL Server. Затем вернитесь в SQL Server Management Studio и обновите папку хранимых процедур. Вы увидите новую запись. GetProductsWithPriceLessThan В окне запроса введите и выполните команду exec GetProductsWithPriceLessThan 25, которая будет перечислять все продукты менее $ 25, как показано на рисунке 14.

Продукты в размере $25 отображаются

Рис. 14. Отображаются продукты в размере $25 (щелкните, чтобы просмотреть изображение полного размера)

Шаг 6. Вызов управляемой хранимой процедуры из уровня доступа к данным

На этом этапе мы добавили GetDiscontinuedProducts и GetProductsWithPriceLessThan управляемые хранимые процедуры в ManagedDatabaseConstructs проект и зарегистрировали их в базе данных SQL Server Northwind. Мы также вызвали эти управляемые хранимые процедуры из SQL Server Management Studio (см. рис. 13 и 14). Для использования этих управляемых хранимых процедур приложением ASP.NET необходимо добавить их в уровни доступа к данным и бизнес-логике в архитектуре. На этом шаге мы добавим два новых метода ProductsTableAdapter в NorthwindWithSprocs типизированном наборе данных, который изначально был создан в руководстве по созданию новых хранимых процедур для типизированного набора данных таблицыAdapters . На шаге 7 мы добавим соответствующие методы в BLL.

Откройте типизированный NorthwindWithSprocs набор данных в Visual Studio и начните с добавления нового метода в ProductsTableAdapter именованный GetDiscontinuedProductsнабор данных. Чтобы добавить новый метод в TableAdapter, щелкните правой кнопкой мыши имя TableAdapter в конструкторе и выберите параметр "Добавить запрос" в контекстном меню.

Примечание.

Так как мы переместили базу данных Northwind из App_Data папки в экземпляр базы данных SQL Server 2005 Express Edition, необходимо обновить соответствующую строка подключения в Web.config, чтобы отразить это изменение. На шаге 2 мы обсудили обновление NORTHWNDConnectionString значения в Web.config. Если вы забыли сделать это обновление, появится сообщение об ошибке, которое не удалось добавить запрос. Не удалось найти соединение NORTHWNDConnectionString для объекта Web.config в диалоговом окне при попытке добавить новый метод в TableAdapter. Чтобы устранить эту ошибку, нажмите кнопку "ОК", а затем перейдите Web.config и обновите NORTHWNDConnectionString значение, как описано на шаге 2. Затем попробуйте повторно добавить метод в TableAdapter. На этот раз он должен работать без ошибок.

Добавление нового метода запускает мастер настройки запросов TableAdapter, который мы использовали много раз в прошлых руководствах. Первый шаг просит указать, как TableAdapter должен получить доступ к базе данных: с помощью нерегламентированной инструкции SQL или с помощью новой или существующей хранимой процедуры. Так как мы уже создали и зарегистрировали управляемую GetDiscontinuedProducts хранимую процедуру в базе данных, выберите параметр "Использовать существующую хранимую процедуру" и нажмите кнопку "Далее".

Выберите параметр

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

На следующем экране появится запрос на хранимую процедуру, которую вызывает метод. Выберите управляемую GetDiscontinuedProducts хранимую процедуру из раскрывающегося списка и нажмите кнопку "Далее".

Выберите управляемую хранимую процедуру GetDiscontinuedProducts

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

Затем мы просим указать, возвращает ли хранимая процедура строки, одно значение или ничего. Так как GetDiscontinuedProducts возвращает набор строк прекращенных продуктов, выберите первый вариант (табличные данные) и нажмите кнопку "Далее".

Выберите параметр табличных данных

Рис. 17. Выберите параметр табличных данных (щелкните, чтобы просмотреть изображение полного размера)

На последнем экране мастера можно указать используемые шаблоны доступа к данным и имена результирующего метода. Оставьте флажки флажки и назовите методы FillByDiscontinued и GetDiscontinuedProducts. Чтобы завершить работу мастера, нажмите кнопку Готово .

Назовите методы FillByDiscontinued и GetDiscontinuedProducts

Рис. 18. Назовите методы FillByDiscontinued и GetDiscontinuedProducts (щелкните, чтобы просмотреть изображение полного размера)

Повторите эти действия, чтобы создать методы с именем FillByPriceLessThan и GetProductsWithPriceLessThan в ProductsTableAdapter управляемой хранимой процедуре GetProductsWithPriceLessThan .

На рисунке 19 показан снимок экрана конструктора наборов данных после добавления методов в ProductsTableAdapter GetDiscontinuedProducts хранимые процедуры и GetProductsWithPriceLessThan управляемые процедуры.

ProductsTableAdapter включает новые методы, добавленные на этом шаге.

Рис. 19. Включает ProductsTableAdapter новые методы, добавленные на этом шаге (щелкните, чтобы просмотреть изображение полного размера)

Шаг 7. Добавление соответствующих методов на уровень бизнес-логики

Теперь, когда мы обновили уровень доступа к данным, чтобы включить методы для вызова управляемых хранимых процедур, добавленных на шаге 4 и 5, необходимо добавить соответствующие методы в уровень бизнес-логики. Добавьте в класс следующие два метода ProductsBLLWithSprocs :

[System.ComponentModel.DataObjectMethodAttribute
    (System.ComponentModel.DataObjectMethodType.Select, false)]
public NorthwindWithSprocs.ProductsDataTable GetDiscontinuedProducts()
{
    return Adapter.GetDiscontinuedProducts();
}
[System.ComponentModel.DataObjectMethodAttribute
    (System.ComponentModel.DataObjectMethodType.Select, false)]
public NorthwindWithSprocs.ProductsDataTable 
    GetProductsWithPriceLessThan(decimal priceLessThan)
{
    return Adapter.GetProductsWithPriceLessThan(priceLessThan);
}

Оба метода просто вызывают соответствующий метод DAL и возвращают ProductsDataTable экземпляр. Разметка DataObjectMethodAttribute над каждым методом приводит к тому, что эти методы будут включены в раскрывающийся список на вкладке SELECT мастера настройки источника данных ObjectDataSource.

Шаг 8. Вызов управляемых хранимых процедур из слоя презентации

Благодаря уровням бизнес-логики и доступа к данным, чтобы включить поддержку вызова GetDiscontinuedProducts и GetProductsWithPriceLessThan управляемых хранимых процедур, теперь можно отобразить результаты этих хранимых процедур на странице ASP.NET.

ManagedFunctionsAndSprocs.aspx Откройте страницу в AdvancedDAL папке и из панели элементов перетащите GridView в конструктор. Задайте для свойства DiscontinuedProducts GridView ID значение и из смарт-тега привязать его к новому объекту ObjectDataSource с именем DiscontinuedProductsDataSource. Настройте ObjectDataSource для извлечения данных из ProductsBLLWithSprocs метода класса GetDiscontinuedProducts .

Настройка ObjectDataSource для использования класса ProductsBLLWithSprocs

Рис. 20. Настройка ObjectDataSource для использования ProductsBLLWithSprocs класса (щелкните, чтобы просмотреть изображение полного размера)

Выберите метод GetDiscontinuedProducts из раскрывающегося списка на вкладке SELECT

Рис. 21. Выберите GetDiscontinuedProducts метод из раскрывающегося списка на вкладке SELECT (щелкните, чтобы просмотреть изображение полного размера)

Так как эта сетка будет использоваться только для отображения сведений о продукте, задайте раскрывающийся список на вкладках UPDATE, INSERT и DELETE (Нет) и нажмите кнопку "Готово".

После завершения работы мастера Visual Studio автоматически добавит область BoundField или CheckBoxField для каждого поля данных в списке ProductsDataTable. Чтобы удалить все эти поля, кроме ProductName и Discontinued, в какой момент декларативная разметка GridView и ObjectDataSource должны выглядеть примерно так:

<asp:GridView ID="DiscontinuedProducts" runat="server" 
    AutoGenerateColumns="False" DataKeyNames="ProductID" 
    DataSourceID="DiscontinuedProductsDataSource">
    <Columns>
        <asp:BoundField DataField="ProductName" HeaderText="ProductName" 
            SortExpression="ProductName" />
        <asp:CheckBoxField DataField="Discontinued" 
            HeaderText="Discontinued" 
            SortExpression="Discontinued" />
    </Columns>
</asp:GridView>
<asp:ObjectDataSource ID="DiscontinuedProductsDataSource" runat="server" 
    OldValuesParameterFormatString="original_{0}"
    SelectMethod="GetDiscontinuedProducts" TypeName="ProductsBLLWithSprocs">
</asp:ObjectDataSource>

Просмотрите эту страницу через браузер. При посещении страницы ОбъектDataSource вызывает ProductsBLLWithSprocs метод класса GetDiscontinuedProducts . Как мы видели на шаге 7, этот метод вызывает метод класса GetDiscontinuedProducts DALProductsDataTable, который вызывает GetDiscontinuedProducts хранимую процедуру. Эта хранимая процедура является управляемой хранимой процедурой и выполняет код, созданный на шаге 3, возвращая прекращенные продукты.

Результаты, возвращаемые управляемой хранимой процедурой, упаковываются в DAL, а затем возвращаются в ProductsDataTable BLL, который затем возвращает их на уровень презентации, где они привязаны к GridView и отображаются. Как ожидается, сетка перечисляет те продукты, которые были прекращены.

Неорванные продукты перечислены

Рис. 22. Список прекращенных продуктов (щелкните, чтобы просмотреть изображение полного размера)

Для дальнейшего использования добавьте textBox и другой GridView на страницу. В этом GridView отображаются продукты меньше, чем сумма, введенная в TextBox, путем вызова ProductsBLLWithSprocs метода класса GetProductsWithPriceLessThan .

Шаг 9. Создание и вызов пользовательских файлов T-SQL

Определяемые пользователем функции или определяемые пользователем функции — это объекты базы данных, которые тесно имитируют семантику функций на языках программирования. Как и функция в C#, определяемые пользователем функции могут включать переменное число входных параметров и возвращать значение определенного типа. UDF может возвращать скалярные данные — строку, целое число и т. д. — или табличные данные. Давайте рассмотрим оба типа определяемых пользователем типов, начиная с UDF, который возвращает скалярный тип данных.

Следующий UDF вычисляет предполагаемое значение инвентаризации для определенного продукта. Это делается путем приема трех входных параметров — UnitPriceUnitsInStockи Discontinued значений для конкретного продукта — и возвращает значение типаmoney. Он вычисляет предполагаемое значение инвентаризации путем умножения UnitPrice на UnitsInStockнего. Для прекращенных элементов это значение сокращается.

CREATE FUNCTION udf_ComputeInventoryValue
(
    @UnitPrice money,
    @UnitsInStock smallint,
    @Discontinued bit
)
RETURNS money
AS
BEGIN
    DECLARE @Value decimal
    SET @Value = ISNULL(@UnitPrice, 0) * ISNULL(@UnitsInStock, 0)
    IF @Discontinued = 1
        SET @Value = @Value * 0.5
    
    RETURN @Value
END

После добавления UDF в базу данных его можно найти в Management Studio, разверив папку Programmability, а затем Функции и скалярные функции. Его можно использовать в запросе SELECT следующим образом:

SELECT ProductID, ProductName, dbo.udf_ComputeInventoryValue
    (UnitPrice, UnitsInStock, Discontinued) as InventoryValue
FROM Products
ORDER BY InventoryValue DESC

Я добавил UDF в udf_ComputeInventoryValue базу данных Northwind; На рисунке 23 показаны выходные данные приведенного выше SELECT запроса при просмотре с помощью Management Studio. Кроме того, обратите внимание, что UDF указан в папке Scalar-value Functions в обозреватель объектов.

Список значений инвентаризации каждого продукта

Рис. 23. Список значений инвентаризации каждого продукта (щелкните, чтобы просмотреть изображение полного размера)

Определяемые пользователем функции также могут возвращать табличные данные. Например, мы можем создать UDF, который возвращает продукты, принадлежащие определенной категории:

CREATE FUNCTION dbo.udf_GetProductsByCategoryID
(    
    @CategoryID int
)
RETURNS TABLE 
AS
RETURN 
(
    SELECT ProductID, ProductName, SupplierID, CategoryID, 
           QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, 
           ReorderLevel, Discontinued
    FROM Products
    WHERE CategoryID = @CategoryID
)

UDF udf_GetProductsByCategoryID принимает входной @CategoryID параметр и возвращает результаты указанного SELECT запроса. После создания этот UDF можно ссылаться в FROM предложении SELECT (илиJOIN) запроса. В следующем примере возвращаются ProductIDProductNameзначения и CategoryID значения для каждого из напитков.

SELECT ProductID, ProductName, CategoryID
FROM dbo.udf_GetProductsByCategoryID(1)

Я добавил UDF в udf_GetProductsByCategoryID базу данных Northwind; На рисунке 24 показаны выходные данные приведенного выше SELECT запроса при просмотре с помощью Management Studio. Определяемые пользователем функции, возвращающие табличные данные, можно найти в папке функций табличного значения обозреватель объектов.

Идентификатор productID, ProductName и CategoryID перечислены для каждого напитка

Рис. 24. ProductIDCategoryID ProductNameСписок и список для каждого напитка (щелкните, чтобы просмотреть изображение полного размера)

Примечание.

Дополнительные сведения о создании и использовании определяемых пользователем функций см . в разделе "Введение в определяемые пользователем функции". Также ознакомьтесь с преимуществами и недостатками определяемых пользователем функций.

Шаг 10. Создание управляемой UDF

udf_GetProductsByCategoryID Объекты udf_ComputeInventoryValue базы данных T-SQL, созданные в приведенных выше примерах, представляют собой объекты базы данных T-SQL. SQL Server 2005 также поддерживает управляемые определяемые пользователем функции, которые можно добавить в ManagedDatabaseConstructs проект так же, как управляемые хранимые процедуры из шагов 3 и 5. Для этого шага давайте реализуем udf_ComputeInventoryValue UDF в управляемом коде.

Чтобы добавить управляемый UDF в ManagedDatabaseConstructs проект, щелкните правой кнопкой мыши имя проекта в Обозреватель решений и выберите команду "Добавить новый элемент". Выберите определяемый пользователем шаблон в диалоговом окне "Добавление нового элемента" и назовите новый UDF-файл udf_ComputeInventoryValue_Managed.cs.

Добавление нового управляемого UDF в проект ManagedDatabaseConstructs

Рис. 25. Добавление нового управляемого UDF в ManagedDatabaseConstructs проект (щелкните, чтобы просмотреть изображение полного размера)

Шаблон определяемой пользователем функции создает partial класс с именем UserDefinedFunctions метода, имя которого совпадает с именем файла класса (udf_ComputeInventoryValue_Managedв этом экземпляре). Этот метод украшен атрибутом, который помечает метод как SqlFunctionуправляемый UDF.

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
public partial class UserDefinedFunctions
{
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlString udf_ComputeInventoryValue_Managed()
    {
        // Put your code here
        return new SqlString("Hello");
    }
};

В udf_ComputeInventoryValue настоящее время метод возвращает SqlString объект и не принимает входные параметры. Необходимо обновить определение метода, чтобы он принял три входных параметра — UnitPriceUnitsInStockи — и Discontinued возвращает SqlMoney объект. Логика вычисления значения инвентаризации идентична этой логике в UDF T-SQL udf_ComputeInventoryValue .

[Microsoft.SqlServer.Server.SqlFunction]
public static SqlMoney udf_ComputeInventoryValue_Managed
    (SqlMoney UnitPrice, SqlInt16 UnitsInStock, SqlBoolean Discontinued)
{
    SqlMoney inventoryValue = 0;
    if (!UnitPrice.IsNull && !UnitsInStock.IsNull)
    {
        inventoryValue = UnitPrice * UnitsInStock;
        if (Discontinued == true)
            inventoryValue = inventoryValue * new SqlMoney(0.5);
    }
    return inventoryValue;
}

Обратите внимание, что входные параметры метода UDF имеют соответствующие типы SQL: SqlMoney для поля, SqlInt16 для UnitPrice UnitsInStockи SqlBoolean для Discontinued. Эти типы данных отражают типы, определенные в Products таблице: UnitPrice столбец имеет тип money, UnitsInStock столбец типа smallintи Discontinued столбец типа bit.

Код начинается с создания экземпляра SqlMoney с именем inventoryValue , которому присваивается значение 0. Таблица Products позволяет использовать значения базы данных NULL в UnitsInPrice столбцах и UnitsInStock столбцах. Поэтому сначала необходимо проверить, содержат NULL ли эти значения с помощью SqlMoney свойства объектаIsNull. Если оба UnitPrice значения и UnitsInStock не содержатNULL значения, мы вычисляем inventoryValue , чтобы быть продуктом двух. Затем, если Discontinued задано значение true, то мы сократили значение.

Примечание.

Объект SqlMoney позволяет умножать только два SqlMoney экземпляра. Он не позволяет SqlMoney экземпляру умножаться на число с плавающей запятой. Таким образом, чтобы уменьшить его на inventoryValue новый SqlMoney экземпляр, имеющий значение 0,5.

Шаг 11. Развертывание управляемой UDF

Теперь, когда создан управляемый UDF, мы готовы развернуть его в базе данных Northwind. Как мы видели на шаге 4, управляемые объекты в проекте SQL Server развертываются, щелкнув правой кнопкой мыши имя проекта в Обозреватель решений и выбрав параметр "Развернуть" в контекстном меню.

После развертывания проекта вернитесь в SQL Server Management Studio и обновите папку Scalar-valued Functions. Теперь вы увидите две записи:

  • dbo.udf_ComputeInventoryValue — UDF T-SQL, созданный на шаге 9, и
  • dbo.udf ComputeInventoryValue_Managed — управляемый UDF, созданный на шаге 10, который был только что развернут.

Чтобы протестировать этот управляемый UDF, выполните следующий запрос из Среды Management Studio:

SELECT ProductID, ProductName, 
       dbo.udf_ComputeInventoryValue_Managed(
                 UnitPrice, 
                 UnitsInStock, 
                 Discontinued
              ) as InventoryValue
FROM Products
ORDER BY InventoryValue DESC

Эта команда использует управляемый udf ComputeInventoryValue_Managed UDF вместо UDF T-SQL udf_ComputeInventoryValue , но выходные данные совпадают. Вернитесь на рис. 23, чтобы просмотреть снимок экрана выходных данных UDF.

Шаг 12. Отладка объектов управляемой базы данных

В руководстве по отладке хранимых процедур мы обсудили три варианта отладки SQL Server с помощью Visual Studio: Прямая отладка базы данных, отладка приложений и отладка из проекта SQL Server. Управляемые объекты базы данных нельзя отлаживать с помощью прямой отладки базы данных, но их можно отлаживать из клиентского приложения и непосредственно из проекта SQL Server. Однако для отладки база данных SQL Server 2005 должна разрешить отладку SQL/CLR. Помните, что когда мы впервые создали ManagedDatabaseConstructs проект Visual Studio, спросили, хотите ли мы включить отладку SQL/CLR (см. рис. 6 на шаге 2). Этот параметр можно изменить, щелкнув правой кнопкой мыши базу данных в окне обозревателя серверов.

Убедитесь, что база данных разрешает отладку SQL/CLR

Рис. 26. Убедитесь, что база данных разрешает отладку SQL/CLR

Представьте, что мы хотели отладить управляемую GetProductsWithPriceLessThan хранимую процедуру. Сначала мы зададим точку останова в коде GetProductsWithPriceLessThan метода.

Установка точки останова в методе GetProductsWithPriceLessThan

Рис. 27. Установка точки останова в методе GetProductsWithPriceLessThan (щелкните, чтобы просмотреть изображение полного размера)

Сначала рассмотрим отладку объектов управляемой базы данных из проекта SQL Server. Так как наше решение включает два проекта — ManagedDatabaseConstructs проект SQL Server вместе с нашим веб-сайтом— для отладки из проекта SQL Server необходимо указать Visual Studio запустить ManagedDatabaseConstructs проект SQL Server при запуске отладки. Щелкните проект правой кнопкой мыши ManagedDatabaseConstructs в Обозреватель решений и выберите параметр Set as StartUp Project в контекстном меню.

ManagedDatabaseConstructs Когда проект запускается из отладчика, он выполняет инструкции SQL в Test.sql файле, который находится в папкеTest Scripts. Например, чтобы проверить GetProductsWithPriceLessThan управляемую хранимую процедуру, замените существующее Test.sql содержимое файла следующим оператором, который вызывает GetProductsWithPriceLessThan управляемую хранимую процедуру, передавающую @CategoryID значение 14.95:

exec GetProductsWithPriceLessThan 14.95

После ввода приведенного выше скрипта Test.sqlначните отладку, перейдя в меню отладки и выбрав "Начать отладку" или нажав клавишу F5 или зеленый значок воспроизведения на панели инструментов. При этом будут создаваться проекты в решении, развертывать управляемые объекты базы данных в базе данных Northwind, а затем выполнять Test.sql скрипт. На этом этапе точка останова будет достигнута, и мы можем выполнить шаги по методу GetProductsWithPriceLessThan , проверить значения входных параметров и т. д.

Точка останова в методе GetProductsWithPriceLessThan была достигнута

Рис. 28. Точка останова в методе GetProductsWithPriceLessThan была достигнута (щелкните, чтобы просмотреть изображение полного размера)

Чтобы объект базы данных SQL был отлажен с помощью клиентского приложения, необходимо настроить базу данных для поддержки отладки приложений. Щелкните правой кнопкой мыши базу данных в обозревателе серверов и убедитесь, что установлен флажок отладки приложений. Кроме того, необходимо настроить приложение ASP.NET для интеграции с отладчиком SQL и отключить пул подключений. Эти шаги подробно описаны на шаге 2 руководства по отладке хранимых процедур .

После настройки приложения и базы данных ASP.NET задайте веб-сайт ASP.NET в качестве запускаемого проекта и запустите отладку. Если вы посещаете страницу, которая вызывает один из управляемых объектов с точкой останова, приложение будет остановлено и управление будет передано отладчику, где можно выполнить шаг по коду, как показано на рис. 28.

Шаг 13. Компиляция и развертывание объектов управляемой базы данных вручную

Проекты SQL Server упрощают создание, компиляцию и развертывание объектов управляемой базы данных. К сожалению, проекты SQL Server доступны только в выпусках Professional и Team Systems Visual Studio. Если вы используете Visual Web Developer или выпуск Standard Visual Studio и хотите использовать управляемые объекты базы данных, вам потребуется вручную создать и развернуть их. Это включает четыре шага.

  1. Создайте файл, содержащий исходный код для объекта управляемой базы данных,
  2. Компиляция объекта в сборку,
  3. Зарегистрируйте сборку в базе данных SQL Server 2005 и
  4. Создайте объект базы данных в SQL Server, указывающий на соответствующий метод в сборке.

Чтобы проиллюстрировать эти задачи, давайте создадим новую управляемую хранимую процедуру, которая возвращает эти продукты UnitPrice , которые больше указанного значения. Создайте новый файл на компьютере с именем GetProductsWithPriceGreaterThan.cs и введите следующий код в файл (для этого можно использовать Visual Studio, Блокнот или любой текстовый редактор):

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
public partial class StoredProcedures
{
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void GetProductsWithPriceGreaterThan(SqlMoney price)
    {
        // Create the command
        SqlCommand myCommand = new SqlCommand();
        myCommand.CommandText =
            @"SELECT ProductID, ProductName, SupplierID, CategoryID, 
                     QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, 
                     ReorderLevel, Discontinued
              FROM Products
              WHERE UnitPrice > @MinPrice";
        myCommand.Parameters.AddWithValue("@MinPrice", price);
        // Execute the command and send back the results
        SqlContext.Pipe.ExecuteAndSend(myCommand);
    }
};

Этот код почти идентичен методу, созданному GetProductsWithPriceLessThan на шаге 5. Единственными отличиями являются имена методов, WHERE предложение и имя параметра, используемое в запросе. Обратно в методе GetProductsWithPriceLessThan WHERE предложение считывает: WHERE UnitPrice < @MaxPrice Здесь, в GetProductsWithPriceGreaterThan, мы используем: WHERE UnitPrice > @MinPrice

Теперь необходимо скомпилировать этот класс в сборку. В командной строке перейдите в каталог, в котором сохранен GetProductsWithPriceGreaterThan.cs файл, и используйте компилятор C# (csc.exe) для компиляции файла класса в сборку:

csc.exe /t:library /out:ManuallyCreatedDBObjects.dll GetProductsWithPriceGreaterThan.cs

Если папка, csc.exe содержащаяся не в системе PATH, вам придется полностью ссылаться на его путь, %WINDOWS%\Microsoft.NET\Framework\version\например:

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\csc.exe /t:library /out:ManuallyCreatedDBObjects.dll GetProductsWithPriceGreaterThan.cs

Компиляция GetProductsWithPriceGreaterThan.cs в сборку

Рис. 29. Компиляция GetProductsWithPriceGreaterThan.cs в сборку (щелкните, чтобы просмотреть изображение полного размера)

Флаг /t указывает, что файл класса C# должен быть скомпилирован в библиотеку DLL (а не исполняемый файл). Флаг /out указывает имя результирующей сборки.

Примечание.

Вместо компиляции GetProductsWithPriceGreaterThan.cs файла класса из командной строки можно также использовать Visual C# Express Edition или создать отдельный проект библиотеки классов в Visual Studio выпуск Standard. S ren Jacob Lauritsen доброжелательно предоставил такой проект Visual C# Express Edition с кодом для GetProductsWithPriceGreaterThan хранимой процедуры и двумя управляемыми хранимыми процедурами и UDF, созданными в шагах 3, 5 и 10. Проект S ren также включает команды T-SQL, необходимые для добавления соответствующих объектов базы данных.

С помощью кода, скомпилированного в сборку, мы готовы зарегистрировать сборку в базе данных SQL Server 2005. Это можно выполнить с помощью T-SQL, с помощью команды CREATE ASSEMBLYили с помощью СРЕДЫ SQL Server Management Studio. Давайте сосредоточимся на использовании Management Studio.

В Management Studio разверните папку Programmability в базе данных Northwind. Одна из ее вложенных папок — сборки. Чтобы вручную добавить новую сборку в базу данных, щелкните правой кнопкой мыши папку "Сборки" и выберите "Создать сборку" в контекстном меню. Откроется диалоговое окно "Новая сборка" (см. рис. 30). Нажмите кнопку "Обзор", выберите ManuallyCreatedDBObjects.dll только что скомпилированную сборку и нажмите кнопку "ОК", чтобы добавить сборку в базу данных. Сборка ManuallyCreatedDBObjects.dll не должна отображаться в обозреватель объектов.

Добавление сборки ManuallyCreatedDBObjects.dll в базу данных

Рис. 30. Добавление сборки в ManuallyCreatedDBObjects.dll базу данных (щелкните, чтобы просмотреть изображение полного размера)

Снимок экрана: окно обозреватель объектов с выделенной сборкой ManuallyCreatedDBObjects.dll.

Рис. 31. Список ManuallyCreatedDBObjects.dll в обозреватель объектов

Хотя мы добавили сборку в базу данных Northwind, мы еще не связали хранимую процедуру с GetProductsWithPriceGreaterThan методом в сборке. Для этого откройте новое окно запроса и выполните следующий скрипт:

CREATE PROCEDURE [dbo].[GetProductsWithPriceGreaterThan] 
( 
    @price money 
) 
WITH EXECUTE AS CALLER 
AS 
EXTERNAL NAME [ManuallyCreatedDBObjects].[StoredProcedures].[GetProductsWithPriceGreaterThan] 
GO

При этом создается новая хранимая процедура в базе данных Northwind с именем GetProductsWithPriceGreaterThan и связывает ее с управляемым методом GetProductsWithPriceGreaterThan (который находится в классе StoredProcedures, который находится в сборке ManuallyCreatedDBObjects).

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

exec GetProductsWithPriceGreaterThan 24.95

Как показано на рисунке 32, в приведенной выше команде отображаются сведения об этих продуктах с UnitPrice более чем $24,95.

Снимок экрана: окно Microsoft SQL Server Management Studio с выполненной хранимой процедурой GetProductsWithceGreaterThan, которая отображает продукты с unitPrice больше $ 24,95.

Рис. 32. Список ManuallyCreatedDBObjects.dll в обозреватель объектов (щелкните, чтобы просмотреть изображение полного размера)

Итоги

Microsoft SQL Server 2005 обеспечивает интеграцию со средой CLR, которая позволяет создавать объекты базы данных с помощью управляемого кода. Ранее эти объекты базы данных можно создавать только с помощью T-SQL, но теперь мы можем создать эти объекты с помощью языков программирования .NET, таких как C#. В этом руководстве мы создали две управляемые хранимые процедуры и управляемую определяемую пользователем функцию.

Тип проекта SQL Server Visual Studio упрощает создание, компиляцию и развертывание объектов управляемой базы данных. Кроме того, она предлагает многофункциональную поддержку отладки. Однако типы проектов SQL Server доступны только в выпусках Professional и Team Systems Visual Studio. Для тех, кто использует Visual Web Developer или выпуск Standard Visual Studio, действия по созданию, компиляции и развертыванию должны выполняться вручную, как показано на шаге 13.

Счастливое программирование!

Дополнительные материалы

Дополнительные сведения о разделах, описанных в этом руководстве, см. в следующих ресурсах:

Об авторе

Скотт Митчелл, автор семи книг ASP/ASP.NET и основатель 4GuysFromRolla.com, работает с технологиями Microsoft Web с 1998 года. Скотт работает независимым консультантом, тренером и писателем. Его последняя книга Сэмс Учит себя ASP.NET 2.0 в 24 часах. Он может быть достигнут в mitchell@4GuysFromRolla.com. или через его блог, который можно найти на http://ScottOnWriting.NET.

Особое спасибо

Эта серия учебников была проверена многими полезными рецензентами. Ведущий рецензент для этого руководства был S ren Джейкоб Лоритсен. Помимо просмотра этой статьи, S ren также создал проект Visual C# Express Edition, включенный в эту статью, для компиляции объектов управляемой базы данных вручную. Хотите просмотреть мои предстоящие статьи MSDN? Если да, упадите меня линию в mitchell@4GuysFromRolla.com.