Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом руководстве мы продолжаем смотреть на элемент управления 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
диалоговом окне добавления 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>
При вызове Select()
метода SqlDataSource UnitPrice
значение параметра (25.00) применяется к @UnitPrice
параметру в параметре SelectCommand
перед отправкой в базу данных. Из таблицы Products
возвращаются только те продукты, стоимость которых не превышает 25,00 долл. США. Чтобы подтвердить это, добавьте GridView на страницу, привяжите его к этому источнику данных, а затем просмотрите страницу через браузер. Вы увидите только те продукты, которые меньше или равны $25,00, что подтверждается Рисунком 3.
Рис. 3. Отображаются только те продукты меньше или равно $25,00 (щелкните, чтобы просмотреть изображение полного размера)
Шаг 2. Добавление параметров в настраиваемую инструкцию SQL
При добавлении настраиваемой инструкции SQL можно явно ввести WHERE
предложение или указать значение в ячейке фильтра построителя запросов. Чтобы продемонстрировать это, давайте отобразим только те продукты в GridView, цены которых меньше определенного порога. Начните с добавления TextBox на ParameterizedQueries.aspx
страницу для сбора этого порогового значения от пользователя. Задайте для свойства ID
TextBox значение MaxPrice
. Добавьте веб-элемент управления Button и задайте для свойства Text
значение Display Matching Products.
Затем перетащите GridView на страницу и из его смарт-тега выберите создать новый объект SqlDataSource с именем ProductsFilteredByPriceDataSource
. В мастере настройки источника данных перейдите к экрану "Указать пользовательскую инструкцию SQL" или экран хранимой процедуры (см. рис. 4) и введите следующий запрос:
SELECT ProductName, UnitPrice
FROM Products
WHERE UnitPrice <= @MaximumPrice
После ввода запроса (вручную или с помощью построителя запросов) нажмите кнопку "Далее".
Рис. 4. Возвращает только те продукты, которые меньше или равно значению параметра (щелкните, чтобы просмотреть изображение полного размера)
Так как запрос содержит параметры, следующий экран в мастере запрашивает у нас источник значений параметров. Выберите "Элемент управления" из раскрывающегося списка источника параметров и 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 когда-либо будет иметь инвентаризацию, цена за единицу которой превышает $1000000. Однако этот подход является недальновидным и может не работать в других ситуациях.
В предыдущих руководствах — декларативные параметры и основные или подробные фильтры с помощью раскрывающегося списка мы столкнулись с аналогичной проблемой. Наше решение было поставить эту логику на уровне бизнес-логики. В частности, 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 в текстовое поле Значение по умолчанию.
Рис. 11. Используйте значение Hard-Coded 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
и задайте для него значение ID
RandomCategoryDataSource
. Настройте его таким образом, чтобы он использовал следующий 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
. Точный тип, возвращаемый, зависит от значения свойства элемента управления DataSourceMode
SqlDataSource. Как обсуждалось в предыдущем руководстве, это свойство можно задать значением либо DataSet
, либо DataReader
. Если задано DataSet
значение , Select()
метод возвращает объект DataView ; если задано DataReader
значение, он возвращает объект, реализующий IDataReader
. Так как свойство RandomCategoryDataSource
у DataSourceMode
SqlDataSource задано как DataSet
(по умолчанию), мы будем работать с объектом DataView.
В следующем коде показано, как получить записи из RandomCategoryDataSource
SqlDataSource в виде DataView, а также как считывать CategoryName
значение столбца из первой строки DataView:
protected void Page_Load(object sender, EventArgs e)
{
// Get the data from the SqlDataSource as a DataView
DataView randomCategoryView =
(DataView)RandomCategoryDataSource.Select(DataSourceSelectArguments.Empty);
if (randomCategoryView.Count > 0)
{
// Assign the CategoryName value to the Label
CategoryNameLabel.Text =
string.Format("Here are Products in the {0} Category...",
randomCategoryView[0]["CategoryName"].ToString());
}
}
randomCategoryView[0]
возвращает первое DataRowView
значение в DataView.
randomCategoryView[0]["CategoryName"]
возвращает значение столбца CategoryName
в этой первой строке. Учтите, что в DataView типизация переменных осуществляется без строгих ограничений. Чтобы ссылаться на определенное значение столбца, необходимо передать имя столбца в виде строки (CategoryName, в данном случае). На рисунке 13 показано сообщение, отображаемое в CategoryNameLabel
при просмотре страницы. Конечно, фактическое имя категории, отображаемое на странице, случайным образом выбирается SqlDataSource при каждом посещении страницы (включая обратные вызовы).
Рис. 13. Отображается имя случайно выбранной категории (щелкните, чтобы просмотреть изображение полного размера)
Замечание
Если для свойства элемента управления DataSourceMode
SqlDataSource задано DataReader
значение, возвращаемое значение из Select()
метода должно быть приведение IDataReader
к . Чтобы считывать значение столбца CategoryName
из первой строки, мы будем использовать следующий код:
if (randomCategoryReader.Read())
{
string categoryName = randomCategoryReader["CategoryName"].ToString();
...
}
С помощью SqlDataSource, который случайным образом выбирает категорию, мы готовы добавить GridView для отображения продуктов этой категории.
Замечание
Вместо использования веб-элемента управления Label для отображения имени категории мы могли бы добавить FormView или DetailsView на страницу, привязать его к SqlDataSource. Однако использование Label позволило нам изучить, как программно вызывать инструкцию SqlDataSource Select()
и работать с полученными данными в коде.
Шаг 5. Назначение значений параметров программным способом
Все примеры, которые мы видели до сих пор в этом руководстве, использовали либо жестко закодированное значение параметра, либо один из предварительно определенных источников параметров (значение запроса, веб-элемент управления на странице и т. д.). Однако параметры элемента управления SqlDataSource также можно задать программным способом. Чтобы завершить наш текущий пример, нам нужен SqlDataSource, который возвращает все продукты, принадлежащие указанной категории. Этот SqlDataSource будет иметь CategoryID
параметр, значение которого необходимо задать на основе значения столбца, возвращаемого SqlDataSource CategoryID
, в обработчике события RandomCategoryDataSource
.
Начните с добавления 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>
Мы можем программно назначить параметр DefaultValue
в обработчике событий CategoryID
: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.
Особое спасибо кому
Эта серия учебников была проверена многими полезными рецензентами. Ведущие рецензенты для этого руководства были Скотт Клайд, Ранделл Шмидт и Кен Песписа. Хотите просмотреть мои предстоящие статьи MSDN? Если да, напишите мне на mitchell@4GuysFromRolla.com.