Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом руководстве мы продолжаем смотреть на элемент управления SqlDataSource и узнать, как определить параметризованные запросы. Параметры можно задать как декларативно, так и программным способом, и их можно извлечь из нескольких расположений, таких как запросы, состояние сеанса, другие элементы управления и многое другое.
Введение
В предыдущем руководстве мы узнали, как использовать элемент управления SqlDataSource для получения данных непосредственно из базы данных. С помощью мастера настройки источника данных можно выбрать базу данных, а затем либо выбрать столбцы для возврата из таблицы или представления, ввести пользовательскую инструкцию SQL, либо использовать хранимую процедуру. Будь то выбор столбцов из таблицы или представления или ввод пользовательской инструкции SQL, свойство элемента управления SqlDataSource SelectCommand является результирующей ад-хок SQL инструкцией SELECT, и именно эта инструкция SELECT выполняется при вызове метода SqlDataSource Select() (программно или автоматически через веб-элемент управления данными).
Инструкции SQL SELECT, использованные в демонстрациях предыдущего руководства, не содержали WHERE. В инструкции SELECT предложение WHERE можно использовать для ограничения возвращаемых результатов. Например, чтобы отобразить имена продуктов, стоимостью более $ 50,00, можно использовать следующий запрос:
SELECT ProductName
FROM Products
WHERE UnitPrice > 50.00
Как правило, значения, используемые в WHERE предложении, определяются некоторым внешним источником, например значением запроса, переменной сеанса или пользовательскими входными данными из веб-элемента управления на странице. В идеале такие входные данные задаются с помощью параметров. При использовании Microsoft SQL Server параметры указываются с помощью @parameterName:
SELECT ProductName
FROM Products
WHERE UnitPrice > @Price
SqlDataSource поддерживает параметризованные запросы как для SELECT инструкций, так и для INSERT, UPDATE и DELETE инструкций. Кроме того, значения параметров могут быть автоматически извлечены из различных источников запроса, состояния сеанса, элементов управления на странице и т. д. или могут быть назначены программным способом. В этом руководстве мы посмотрим, как определить параметризованные запросы, а также как указать значения параметров как декларативно, так и программно.
Замечание
В предыдущем руководстве мы сравнили ObjectDataSource, который был нашим инструментом выбора в первых 46 руководствах с SqlDataSource, отметив их концептуальные сходства. Эти сходства также расширяются до параметров. Параметры ObjectDataSource, сопоставленные с входными параметрами для методов на уровне бизнес-логики. С помощью SqlDataSource параметры определяются непосредственно в sql-запросе. Оба элемента управления имеют коллекции параметров для своих методов Select(), Insert(), Update() и Delete(), и оба могут иметь эти значения параметров, заполненные из предварительно определенных источников (значения запроса, переменные сеанса и т. д.) или назначенные программным способом.
Создание параметризованного запроса
Мастер настройки источника данных в элементе управления SqlDataSource предлагает три способа определения команды для получения записей базы данных:
- Выбрав столбцы из существующей таблицы или представления,
- Ввод пользовательской инструкции SQL или
- При выборе хранимой процедуры
При выборе столбцов из существующей таблицы или представления параметры предложения WHERE должны быть указаны в диалоговом окне "Добавление WHERE предложения". При создании пользовательской инструкции SQL можно ввести параметры непосредственно в WHERE предложение (с помощью @parameterName для обозначения каждого параметра). Хранимая процедура состоит из одной или нескольких инструкций SQL, и эти инструкции можно параметризовать. Однако параметры, используемые в инструкциях SQL, должны передаваться в качестве входных параметров в хранимую процедуру.
Так как создание параметризованного запроса зависит от того, как указан sqlDataSource s SelectCommand , давайте рассмотрим все три подхода. Чтобы приступить к работе, откройте ParameterizedQueries.aspx страницу в SqlDataSource папке, перетащите элемент управления SqlDataSource из панели элементов в конструктор и установите его ID в Products25BucksAndUnderDataSource. Затем щелкните ссылку "Настроить источник данных" из смарт-тега элемента управления. Выберите базу данных, используемую (NORTHWINDConnectionString) и нажмите кнопку "Далее".
Шаг 1. Добавление предложения WHERE при выборе столбцов из таблицы или представления
При выборе данных, возвращаемых из базы данных с помощью элемента управления SqlDataSource, мастер настройки источника данных позволяет просто выбрать столбцы для возврата из существующей таблицы или представления (см. рис. 1). Это автоматически создает инструкцию SQL SELECT , которая отправляется в базу данных при вызове метода SqlDataSource Select() . Как мы сделали в предыдущем руководстве, выберите таблицу Products из раскрывающегося списка и проверьте столбцы ProductID, ProductName и UnitPrice.
Рис. 1. Выбор столбцов для возврата из таблицы или представления (щелкните, чтобы просмотреть изображение полного размера)
Чтобы включить WHERE предложение в SELECT инструкцию, нажмите WHERE кнопку, которая открывает диалоговое окно "Добавление WHERE предложения" (см. рис. 2). Чтобы добавить параметр, чтобы ограничить результаты, возвращаемые SELECT запросом, сначала выберите столбец для фильтрации данных по. Затем выберите оператор, используемый для фильтрации (=, <<=, =, >и т. д.). Наконец, выберите источник значения параметра, например из строки запроса или состояния сессии. После настройки параметра нажмите кнопку "Добавить", чтобы включить ее в SELECT запрос.
В этом примере давайте возвращаем только те результаты, в которых UnitPrice значение меньше или равно $25,00. Поэтому выберите UnitPrice из раскрывающегося списка "Столбец" и <= из раскрывающегося списка "Оператор". При использовании жестко закодированного значения параметра (например, $25.00) или при программном указании значения параметра выберите None в раскрывающемся списке "Источник". Затем введите жестко закодированное значение параметра в текстовом поле "Значение" 25.00 и завершите процесс, нажав кнопку "Добавить".
Рис. 2. Ограничение результатов, возвращаемых из диалогового окна "Добавление WHERE предложения" (щелкните, чтобы просмотреть изображение полного размера)
После добавления параметра нажмите кнопку "ОК", чтобы вернуться в мастер настройки источника данных. Теперь оператор SELECT в нижней части мастера должен содержать WHERE условие с параметром с именем @UnitPrice:
SELECT [ProductID], [ProductName], [UnitPrice]
FROM [Products]
WHERE ([UnitPrice] <= @UnitPrice)
Замечание
Если в диалоговом окне добавления WHERE предложения указано несколько условий, мастер присоединяет их с помощью оператора AND. Если необходимо включить OR в предложение WHERE (например, WHERE UnitPrice <= @UnitPrice OR Discontinued = 1), необходимо создать инструкцию SELECT с помощью экрана пользовательских инструкций SQL.
Завершите настройку SqlDataSource (нажмите кнопку "Далее", затем "Готово") и проверьте декларативную разметку SqlDataSource. Разметка теперь включает <SelectParameters> коллекцию, которая уточняет источники для параметров в SelectCommand.
<asp:SqlDataSource ID="Products25BucksAndUnderDataSource" runat="server"
ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
SelectCommand=
"SELECT [ProductID], [ProductName], [UnitPrice]
FROM [Products] WHERE ([UnitPrice] <= @UnitPrice)">
<SelectParameters>
<asp:Parameter DefaultValue="25.00" Name="UnitPrice" Type="Decimal" />
</SelectParameters>
</asp:SqlDataSource>
При вызове метода SqlDataSource Select(), значение параметра UnitPrice (25.00) применяется к параметру @UnitPrice в SelectCommand перед отправкой в базу данных. Из таблицы Products возвращаются только те товары, которые меньше или равны 25,00 долл. США. Чтобы подтвердить это, добавьте GridView на страницу, привяжите его к этому источнику данных, а затем просмотрите страницу через браузер. Вы должны увидеть только те продукты, которые стоят не более 25,00 доллара, как подтверждает рис. 3.
Рис. 3. Отображаются только те продукты меньше или равно $25,00 (щелкните, чтобы просмотреть изображение полного размера)
Шаг 2. Добавление параметров в настраиваемую инструкцию SQL
При добавлении настраиваемого оператора SQL можно явно ввести предложение WHERE или указать значение в ячейке фильтрации построителя запросов. Чтобы продемонстрировать это, давайте отобразим только те продукты в GridView, цены которых меньше определенного порога. Начните с добавления TextBox на ParameterizedQueries.aspx страницу для сбора этого порогового значения от пользователя. Задайте для свойства IDTextBox значение MaxPrice . Добавьте веб-элемент управления Button и задайте для свойства Text значение Display Matching Products.
Затем перетащите GridView на страницу и из его смарт-тега выберите создать новый объект SqlDataSource с именем ProductsFilteredByPriceDataSource. В мастере настройки источника данных перейдите к экрану "Указать пользовательскую инструкцию SQL" или экран хранимой процедуры (см. рис. 4) и введите следующий запрос:
SELECT ProductName, UnitPrice
FROM Products
WHERE UnitPrice <= @MaximumPrice OR @MaximumPrice = -1.0
После ввода запроса (вручную или с помощью построителя запросов) нажмите кнопку "Далее".
Рис. 4. Возвращает только те продукты, которые меньше или равно значению параметра (щелкните, чтобы просмотреть изображение полного размера)
Так как запрос содержит параметры, следующий экран в мастере запрашивает у нас источник значений параметров. Выберите пункт "Control" из раскрывающегося списка "Parameter source" и MaxPrice (значение элемента управления TextBox ID) из раскрывающегося списка "ControlID". Можно также ввести необязательное значение по умолчанию для использования в случае, если пользователь не ввел текст в MaxPrice TextBox. Пока не введите значение по умолчанию.
Рис. 5. Свойство MaxPrice TextBox Text используется в качестве источника параметров (щелкните, чтобы просмотреть изображение полного размера)
Завершите работу мастера настройки источника данных, нажав кнопку "Далее", а затем "Готово". Декларативная разметка для компонентов GridView, TextBox, Button и SqlDataSource выглядит следующим образом:
Maximum price:
$<asp:TextBox ID="MaxPrice" runat="server" Columns="5" />
<asp:Button ID="DisplayProductsLessThanButton" runat="server"
Text="Display Matching Products" />
<asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False"
DataSourceID="ProductsFilteredByPriceDataSource" EnableViewState="False">
<Columns>
<asp:BoundField DataField="ProductName" HeaderText="Product"
SortExpression="ProductName" />
<asp:BoundField DataField="UnitPrice" HeaderText="Price"
HtmlEncode="False" DataFormatString="{0:c}"
SortExpression="UnitPrice" />
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="ProductsFilteredByPriceDataSource" runat="server"
ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
SelectCommand=
"SELECT ProductName, UnitPrice
FROM Products WHERE UnitPrice <= @MaximumPrice">
<SelectParameters>
<asp:ControlParameter ControlID="MaxPrice" Name="MaximumPrice"
PropertyName="Text" />
</SelectParameters>
</asp:SqlDataSource>
Обратите внимание, что параметр в разделе SqlDataSource <SelectParameters> является параметром ControlParameter, который включает дополнительные свойства, например ControlID и PropertyName. При вызове метода Select() SqlDataSource ControlParameter извлекает значение из указанного свойства веб-элемента управления и присваивает его соответствующему параметру в объекте SelectCommand. В этом примере свойство Text MaxPrice используется в качестве значения параметра @MaxPrice.
Потратьте минуту, чтобы просмотреть эту страницу через браузер. При первом посещении страницы или всякий раз, когда MaxPrice текстовое поле не имеет значения, записи не отображаются в GridView.
Рис. 6. Записи не отображаются при MaxPrice пустом текстовом поле (щелкните, чтобы просмотреть изображение полного размера)
Причина, по которой не отображаются продукты, заключается в том, что по умолчанию пустая строка для значения параметра преобразуется в значение базы данных NULL . Так как сравнение [UnitPrice] <= NULL всегда вычисляется как false, результаты не возвращаются.
Введите значение в текстовое поле, например 5.00, и нажмите кнопку "Показать соответствующие продукты". При обратной отправке SqlDataSource сообщает GridView о том, что один из его источников параметров изменился. Следовательно, GridView повторно привязывается к SqlDataSource, отображая эти продукты с ценой меньше или равными 5,00 $.
Рис. 7. Отображаются продукты меньше или равно $5,00 (щелкните, чтобы просмотреть изображение полного размера)
Первоначальное отображение всех продуктов
Вместо того чтобы при первой загрузке страницы не отображать продукты, возможно, следует отобразить все продукты. Один из способов перечислить все продукты, когда MaxPrice TextBox пуст, заключается в установке значения по умолчанию параметра на чрезвычайно высокое число, например 1000000, поскольку маловероятно, что Northwind Traders когда-нибудь будет иметь запасы, стоимость единицы которых превышает $1,000,000. Однако такой подход является недальновидным и может не сработать в других ситуациях.
В предыдущих руководствах — декларативные параметры и основные или подробные фильтры с помощью раскрывающегося списка мы столкнулись с аналогичной проблемой. Наше решение было поставить эту логику на уровне бизнес-логики. В частности, BLL изучил входящее значение и, если это было NULL или какое-то зарезервированное значение, вызов был перенаправлен в метод DAL, возвращающий все записи. Если входящее значение было обычным значением фильтрации, вызов был выполнен в метод DAL, выполняющий инструкцию SQL, которая использовала параметризованное WHERE предложение с указанным значением.
К сожалению, мы обходим архитектуру при использовании SqlDataSource. Вместо этого необходимо настроить инструкцию SQL для интеллектуального захвата всех записей, если @MaximumPrice параметр имеет NULL или какое-то зарезервированное значение. В этом упражнении давайте сделаем так, чтобы, если параметр @MaximumPrice равен -1.0, все записи должны быть возвращены (-1.0 используется как зарезервированное значение, так как ни один продукт не может иметь отрицательное значение UnitPrice). Для этого можно использовать следующую инструкцию SQL:
SELECT ProductName, UnitPrice
FROM Products
WHERE UnitPrice <= @MaximumPrice OR @MaximumPrice = -1.0
Это WHERE предложение возвращает все записи, если @MaximumPrice параметр равен -1.0. Если значение параметра не -1.0, возвращаются только те продукты, которые UnitPrice меньше или равно значению параметра @MaximumPrice. При установке значения `@MaximumPrice` параметра по умолчанию в `-1.0` при первой загрузке страницы (или всякий раз, когда текстовое поле `MaxPrice` пусто), `@MaximumPrice` будет иметь значение `-1.0`, и все продукты будут отображаться.
Рис. 8. Теперь все продукты отображаются при MaxPrice пустом текстовом поле (щелкните, чтобы просмотреть изображение полного размера)
Существует несколько предостережений, которые следует отметить с этим подходом. Во-первых, понимаете, что тип данных параметра определяется его использованием в SQL-запросе. Если изменить WHERE предложение на @MaximumPrice = -1.0@MaximumPrice = -1, среда выполнения обрабатывает параметр как целое число. Если вы пытаетесь назначить MaxPrice текстовое поле десятичному значению (например, 5.00), ошибка возникнет, так как она не может преобразовать 5.00 в целое число. Чтобы устранить эту проблему, убедитесь, что вы используете @MaximumPrice = -1.0 в WHERE предложении или, еще лучше, задайте ControlParameter для свойства объекта Type значение Decimal.
Во-вторых, добавив OR @MaximumPrice = -1.0 к предложению WHERE, обработчик запросов не может использовать индекс UnitPrice (если он существует), что приведет к полному сканированию таблицы. Это может повлиять на производительность, если в Products таблице достаточно большое количество записей. Лучшая методика — переместить эту логику в хранимую процедуру, в которой оператор IF выполнит запрос SELECT из таблицы Products без предложения WHERE, если нужно вернуть все записи, либо тот, у которого предложение WHERE содержит только критерии UnitPrice, чтобы использовать индекс.
Шаг 3. Создание и использование параметризованных хранимых процедур
Хранимые процедуры могут включать набор входных параметров, которые затем можно использовать в инструкциях SQL, определенных в хранимой процедуре. При настройке SqlDataSource для использования хранимой процедуры, которая принимает входные параметры, эти значения параметров можно указать с помощью таких же методов, как и с нерегламентированными инструкциями SQL.
Чтобы проиллюстрировать использование хранимых процедур в SqlDataSource, давайте создадим новую хранимую процедуру в базе данных Northwind с именем GetProductsByCategory, которая принимает параметр с именем @CategoryID и возвращает все столбцы продуктов, у которых столбец CategoryID совпадает с @CategoryID. Чтобы создать хранимую процедуру, перейдите в обозреватель сервера и выполните детализацию базы NORTHWND.MDF данных. (Если обозреватель сервера не отображается, откройте его, перейдя в меню "Вид" и выбрав параметр обозревателя серверов.)
NORTHWND.MDF В базе данных щелкните правой кнопкой мыши папку хранимых процедур, выберите "Добавить новую хранимую процедуру" и введите следующий синтаксис:
CREATE PROCEDURE dbo.GetProductsByCategory
(
@CategoryID int
)
AS
SELECT *
FROM Products
WHERE CategoryID = @CategoryID
Щелкните значок "Сохранить" (или CTRL+S), чтобы сохранить хранимую процедуру. Чтобы проверить хранимую процедуру, щелкните ее правой кнопкой мыши в папке хранимых процедур и выбрав "Выполнить". Это предложит вам параметры хранимой процедуры (@CategoryID, в этом экземпляре), и затем результаты будут отображаться в окне вывода.
Рис. 9.GetProductsByCategory Хранимая процедура при выполнении с @CategoryID 1 (щелкните, чтобы просмотреть изображение полного размера)
Давайте используем эту хранимую процедуру для отображения всех продуктов в категории "Напитки" в GridView. Добавьте новый GridView на страницу и привяжите его к новому SqlDataSource с именем BeverageProductsDataSource. Перейдите на экран "Указание пользовательского SQL-запроса или хранимой процедуры", выберите радиокнопку хранимой процедуры и выберите GetProductsByCategory хранимую процедуру из раскрывающегося списка.
Рис. 10. Выберите GetProductsByCategory хранимую процедуру из списка Drop-Down (щелкните, чтобы просмотреть изображение полного размера)
Так как хранимая процедура принимает входной параметр (@CategoryID), нажмите кнопку "Далее", чтобы указать источник значения этого параметра.
CategoryID Параметр "Напитки" равен 1, поэтому оставьте раскрывающийся список источника параметров на "нет" и введите 1 в текстовое поле DefaultValue.
Рис. 11. Используйте жестко заданное значение 1 для возвращения продуктов в категории "Напитки" (Щелкните, чтобы просмотреть изображение полного размера)
Как показано в следующей декларативной разметке, при использовании хранимой процедуры свойству SqlDataSource SelectCommand присваивается имя хранимой процедуры, а свойство SelectCommandType получает значение StoredProcedure, указывающее, что SelectCommand — это имя хранимой процедуры, а не SQL-запрос.
<asp:SqlDataSource ID="BeverageProductsDataSource" runat="server"
ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
SelectCommand="GetProductsByCategory" SelectCommandType="StoredProcedure">
<SelectParameters>
<asp:Parameter DefaultValue="1" Name="CategoryID" Type="Int32" />
</SelectParameters>
</asp:SqlDataSource>
Проверьте страницу в браузере. Отображаются только те продукты, которые относятся к категории "Напитки", хотя отображаются все поля продукта, так как GetProductsByCategory хранимая процедура возвращает все столбцы из Products таблицы. Конечно, можно ограничить или настроить поля, отображаемые в GridView в диалоговом окне "Изменение столбцов GridView".
Рис. 12. Отображаются все напитки (щелкните, чтобы просмотреть изображение полного размера)
Шаг 4. Программное вызов метода Select() SqlDataSource.
Примеры, которые мы видели в предыдущем руководстве и в этом руководстве до настоящего момента, привязывают элементы управления SqlDataSource прямо к GridView. Однако данные элемента управления SqlDataSource могут быть программно доступны и перечисляются в коде. Это может быть особенно полезно, если необходимо запрашивать данные для их проверки, но отображать их не нужно. Вместо того чтобы записывать весь стандартный код ADO.NET для подключения к базе данных, указания команды и получения результатов, можно разрешить SqlDataSource обрабатывать этот монотонный код.
Чтобы проиллюстрировать работу с данными SqlDataSource программным способом, представьте, что ваш босс обратился к вам с запросом на создание веб-страницы, отображающей имя случайно выбранной категории и связанных с ней продуктов. То есть, когда пользователь посещает эту страницу, мы хотим случайно выбрать категорию из Categories таблицы, отобразить имя категории, а затем перечислить продукты, принадлежащие этой категории.
Для этого необходимо два элемента управления SqlDataSource: один, чтобы получить случайную категорию из таблицы Categories, и другой, чтобы получить продукты этой категории. Мы создадим SqlDataSource, который извлекает запись случайной категории на этом шаге; Шаг 5 рассматривает создание SqlDataSource, который извлекает продукты этой категории.
Сначала добавьте sqlDataSource в ParameterizedQueries.aspx и задайте для него значение IDRandomCategoryDataSource . Настройте его таким образом, чтобы он использовал следующий SQL-запрос:
SELECT TOP 1 CategoryID, CategoryName
FROM Categories
ORDER BY NEWID()
ORDER BY NEWID() возвращает записи, отсортированные в случайном порядке (см. раздел "Использование NEWID() случайной сортировки записей").
SELECT TOP 1 возвращает первую запись из результирующего набора. Этот запрос возвращает значения столбцов CategoryID и CategoryName из одной случайно выбранной категории.
Чтобы отобразить значение категории CategoryName, добавьте на страницу веб-элемент управления Label, установите его свойство ID на CategoryNameLabel, и очистите его свойство Text. Чтобы программным способом получить данные из элемента управления SqlDataSource, необходимо вызвать его Select() метод.
МетодSelect() ожидает один входной параметр типаDataSourceSelectArguments, который указывает, как данные должны быть отправлены перед возвратом. Это может включать инструкции по сортировке и фильтрации данных, а также используются веб-элементами управления данными при сортировке или разбиении данных из элемента управления SqlDataSource. В нашем примере, однако, нам не нужно изменять данные перед возвратом, и поэтому мы передадим объект DataSourceSelectArguments.Empty.
Метод Select() возвращает объект, реализующий IEnumerable. Точный тип, возвращаемый, зависит от значения свойства элемента управления DataSourceModeSqlDataSource. Как описано в предыдущем руководстве, это свойство можно задать для значения либо DataSet, либо DataReader. Если задано DataSetзначение , Select() метод возвращает объект DataView ; если задано DataReaderзначение, он возвращает объект, реализующий IDataReader.
RandomCategoryDataSource Так как в SqlDataSource задано DataSourceMode свойство DataSet (по умолчанию), мы будем работать с объектом DataView.
В следующем коде показано, как получить записи из RandomCategoryDataSource SqlDataSource в виде DataView, а также как считывать CategoryName значение столбца из первой строки DataView:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles Me.Load
' Get the data from the SqlDataSource as a DataView
Dim randomCategoryView As DataView = CType _
(RandomCategoryDataSource.Select(DataSourceSelectArguments.Empty), DataView)
If randomCategoryView.Count > 0 Then
' Assign the CategoryName value to the Label
CategoryNameLabel.Text = String.Format( _
"Here are Products in the {0} Category...", _
randomCategoryView(0)("CategoryName").ToString())
End If
End Sub
randomCategoryView(0) возвращает первое DataRowView значение в DataView.
randomCategoryView(0)("CategoryName") возвращает значение столбца CategoryName в этой первой строке. Обратите внимание, что DataView слабо типизирован. Чтобы ссылаться на определенное значение столбца, необходимо передать имя столбца в виде строки (CategoryName, в данном случае). На рисунке 13 показано сообщение, отображаемое в CategoryNameLabel при просмотре страницы. Конечно, фактическое имя категории, отображаемое на странице, выбирается случайным образом SqlDataSource при каждом посещении страницы (включая обновления страницы).
Рис. 13. Отображается имя случайно выбранной категории (щелкните, чтобы просмотреть изображение полного размера)
Замечание
Если для свойства элемента управления SqlDataSource задано значение DataReader, значение, возвращаемое из метода Select(), должно быть приведено к IDataReader. Чтобы считывать значение столбца CategoryName из первой строки, мы будем использовать следующий код:
If randomCategoryReader.Read() Then
Dim categoryName as String = randomCategoryReader("CategoryName').ToString()
...
End If
Когда SqlDataSource случайным образом выбирает категорию, мы готовы добавить элемент управления GridView, в котором перечислены продукты из этой категории.
Замечание
Вместо использования веб-элемента управления Label для отображения имени категории мы могли бы добавить FormView или DetailsView на страницу, привязать его к SqlDataSource. Однако использование Label позволило нам изучить, как программно вызывать инструкцию SqlDataSource Select() и работать с полученными данными в коде.
Шаг 5. Назначение значений параметров программным способом
Все примеры, которые мы видели до сих пор в этом руководстве, использовали либо жестко закодированное значение параметра, либо один из предварительно определенных источников параметров (значение запроса, веб-элемент управления на странице и т. д.). Однако параметры элемента управления SqlDataSource также можно задать программным способом. Чтобы завершить наш текущий пример, нам нужен SqlDataSource, который возвращает все продукты, принадлежащие указанной категории. Этот SqlDataSource будет иметь параметр CategoryID, значение которого необходимо установить на основе значения столбца CategoryID, возвращаемого SqlDataSource RandomCategoryDataSource в обработчике событий Page_Load.
Начните с добавления GridView на страницу и привяжите его к новому объекту SqlDataSource с именем ProductsByCategoryDataSource. Как и в шаге 3, настройте SqlDataSource таким образом, чтобы он вызвал хранимую процедуру GetProductsByCategory . Оставьте раскрывающийся список источника параметров равным None, но не введите значение по умолчанию, так как мы установим это значение по умолчанию программным способом.
Рис. 14. Не указывайте источник параметров или значение по умолчанию (щелкните, чтобы просмотреть изображение полного размера)
После завершения мастера SqlDataSource результирующая декларативная разметка должна выглядеть следующим образом:
<asp:SqlDataSource ID="ProductsByCategoryDataSource" runat="server"
ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
SelectCommand="GetProductsByCategory" SelectCommandType="StoredProcedure">
<SelectParameters>
<asp:Parameter Name="CategoryID" Type="Int32" />
</SelectParameters>
</asp:SqlDataSource>
Мы можем назначить DefaultValueCategoryID параметр программным способом в обработчике Page_Load событий:
' Assign the ProductsByCategoryDataSource's
' CategoryID parameter's DefaultValue property
ProductsByCategoryDataSource.SelectParameters("CategoryID").DefaultValue = _
randomCategoryView(0)("CategoryID").ToString()
При этом страница содержит GridView, включающую продукты, связанные с случайно выбранной категорией.
Рис. 15. Не указывайте источник параметров или значение по умолчанию (щелкните, чтобы просмотреть изображение полного размера)
Сводка
SqlDataSource позволяет разработчикам страниц определять параметризованные запросы, значения параметров которых можно жестко закодировать, извлекать из предварительно определенных источников параметров или назначать программным способом. В этом руководстве мы узнали, как создать параметризованный запрос из мастера настройки источника данных для нерегламентированных запросов SQL и хранимых процедур. Мы также рассмотрели использование жестко закодированных источников параметров, веб-элемента управления в качестве источника параметров и программного указания значения параметра.
Как и в объекте ObjectDataSource, sqlDataSource также предоставляет возможности для изменения своих базовых данных. В следующем руководстве мы рассмотрим, как определить INSERT, UPDATE, и DELETE операторы с помощью SqlDataSource. После добавления этих инструкций можно использовать встроенные функции вставки, редактирования и удаления, которые являются неотъемлемой частью элементов управления GridView, DetailsView и FormView.
Счастливое программирование!
Об авторе
Скотт Митчелл, автор семи книг ASP/ASP.NET и основатель 4GuysFromRolla.com, работает с технологиями Microsoft Web с 1998 года. Скотт работает независимым консультантом, тренером и писателем. Его последняя книга Sams Teach Yourself ASP.NET 2.0 за 24 часа. С ним можно связаться по mitchell@4GuysFromRolla.com. либо через его блог, который можно найти на http://ScottOnWriting.NET.
Особое спасибо кому
Эта серия учебников была проверена многими полезными рецензентами. Ведущими рецензентами этого руководства были Скотт Клайд, Ранделл Шмидт и Кен Песписа. Хотите просмотреть мои предстоящие статьи MSDN? Если да, напишите мне mitchell@4GuysFromRolla.com.
@CategoryID 1" />