Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В предыдущих руководствах мы использовали элемент управления ObjectDataSource для полного разделения слоя презентации от уровня доступа к данным. Начиная с этого руководства, мы узнаем, как элемент управления SqlDataSource можно использовать для простых приложений, которые не требуют такого строгого разделения доступа к презентации и данным.
Введение
Все руководства, которые мы изучили до сих пор, использовали многоуровневую архитектуру, состоящую из уровней презентации, бизнес-логики и доступа к данным. Уровень доступа к данным (DAL) был создан в первом руководстве (создание уровня доступа к данным) и уровня бизнес-логики во втором (создание уровня бизнес-логики). Начиная с руководства по отображению данных с помощью ObjectDataSource , мы узнали, как использовать новый элемент управления ObjectDataSource ASP.NET 2.0 для декларативного интерфейса с архитектурой на уровне презентации.
Хотя все руководства до сих пор использовали архитектуру для работы с данными, также можно получить доступ к данным, вставлять, обновлять и удалять данные базы данных непосредственно на странице ASP.NET, обходя архитектуру. Это позволяет помещает определенные запросы к базе данных и бизнес-логику непосредственно на веб-странице. Для достаточно крупных или сложных приложений, разработки, реализации и использования многоуровневой архитектуры крайне важно для успешного, обновляемого и обслуживания приложения. Однако разработка надежной архитектуры может быть ненужной при создании чрезвычайно простых одноуровневых приложений.
ASP.NET 2.0 предоставляет пять встроенных элементов управления источниками данных SqlDataSource, AccessDataSource, ObjectDataSource, XmlDataSource и SiteMapDataSource. SqlDataSource можно использовать для доступа и изменения данных непосредственно из реляционной базы данных, включая Microsoft SQL Server, Microsoft Access, Oracle, MySQL и другие. В этом руководстве и следующем трех мы рассмотрим, как работать с элементом управления SqlDataSource, изучить, как запрашивать и фильтровать данные базы данных, а также как использовать SqlDataSource для вставки, обновления и удаления данных.
Рис. 1. ASP.NET 2.0 включает пять встроенных элементов управления источниками данных
Сравнение ObjectDataSource и SqlDataSource
Концептуально элементы управления ObjectDataSource и SqlDataSource — это просто прокси-серверы данных. Как описано в руководстве по отображению данных с помощью ObjectDataSource, объект ObjectDataSource имеет свойства, указывающие тип объекта, предоставляющий данные и методы для вызова для выбора, вставки, обновления и удаления данных из базового типа объекта. После настройки свойств ObjectDataSource веб-элемент управления данными, например GridView, DetailsView или DataList, можно привязать к элементу управления, используя методы ObjectDataSource , Select()
Insert()
Delete()
и Update()
методы для взаимодействия с базовой архитектурой.
SqlDataSource предоставляет те же функции, но работает с реляционной базой данных, а не с библиотекой объектов. С помощью SqlDataSource необходимо указать базу данных строка подключения и нерегламентированные запросы SQL или хранимые процедуры для вставки, обновления, удаления и извлечения данных. Методы и методы SqlDataSource Select()
Insert()
Update()
Delete()
при вызове подключаются к указанной базе данных и выдают соответствующий SQL-запрос. Как показано на следующей схеме, эти методы выполняют работу по подключению к базе данных, выдаче запроса и возврату результатов.
Рис. 2. SqlDataSource служит прокси-сервером базы данных
Примечание.
В этом руководстве мы сосредоточимся на получении данных из базы данных. В руководстве по вставке, обновлению и удалению данных с помощью руководства по элементу управления SqlDataSource мы посмотрим, как настроить SqlDataSource для поддержки вставки, обновления и удаления.
Элементы управления SqlDataSource и AccessDataSource
Помимо элемента управления SqlDataSource, ASP.NET 2.0 также включает элемент управления AccessDataSource. Эти два разных элемента управления привели многих разработчиков к ASP.NET 2.0, чтобы подозревать, что элемент управления AccessDataSource предназначен для работы исключительно с Microsoft Access с элементом управления SqlDataSource, предназначенным для работы исключительно с Microsoft SQL Server. Хотя AccessDataSource предназначен для конкретной работы с Microsoft Access, элемент управления SqlDataSource работает с любой реляционной базой данных, к которым можно получить доступ через .NET. К ним относятся все хранилища данных, совместимые с OleDb или ODBC, такие как Microsoft SQL Server, Microsoft Access, Oracle, Informix, MySQL и PostgreSQL, среди многих других.
Единственное различие между элементами управления AccessDataSource и SqlDataSource заключается в том, как указана информация о подключении к базе данных. Элемент управления AccessDataSource должен иметь только путь к файлу базы данных Access. С другой стороны, SqlDataSource требует полного строка подключения.
Шаг 1. Создание веб-страниц SqlDataSource
Прежде чем начать изучение работы непосредственно с данными базы данных с помощью элемента управления SqlDataSource, сначала создадим страницы ASP.NET в проекте веб-сайта, который нам потребуется для этого руководства и следующих трех. Сначала добавьте новую папку с именем SqlDataSource
. Затем добавьте в нее следующие ASP.NET страницы, чтобы связать каждую страницу с главной страницей Site.master
:
Default.aspx
Querying.aspx
ParameterizedQueries.aspx
InsertUpdateDelete.aspx
OptimisticConcurrency.aspx
Рис. 3. Добавление страниц ASP.NET для учебников, связанных с SqlDataSource
Как и в других папках, Default.aspx
в папке SqlDataSource
будут перечислены учебники в своем разделе. Помните, что элемент SectionLevelTutorialListing.ascx
управления пользователем предоставляет эту функцию. Поэтому добавьте этот элемент управления Default.aspx
пользователем, перетащив его из Обозреватель решений в представление конструктора страницы.
Рис. 4. Добавление пользовательского SectionLevelTutorialListing.ascx
элемента управления Default.aspx
в (щелкните, чтобы просмотреть изображение полного размера)
Наконец, добавьте эти четыре страницы в качестве записей в Web.sitemap
файл. В частности, добавьте следующую разметку после добавления настраиваемых кнопок в DataList и Repeater <siteMapNode>
:
<siteMapNode url="~/SqlDataSource/Default.aspx"
title="Using the SqlDataSource Control"
description="Work directly with database data using the SqlDataSource control.">
<siteMapNode url="~/SqlDataSource/Querying.aspx" title="Retrieving Database Data"
description="Examines how to query data from a database that can then be
displayed through a data Web control."/>
<siteMapNode url="~/SqlDataSource/ParameterizedQueries.aspx"
title="Parameterized Queries"
description="Learn how to specify parameterized WHERE clauses in the
SqlDataSource's SELECT statement." />
<siteMapNode url="~/SqlDataSource/InsertUpdateDelete.aspx"
title="Inserting, Updating, and Deleting Database Data"
description="See how to configure the SqlDataSource to include INSERT, UPDATE,
and DELETE statements." />
<siteMapNode url="~/SqlDataSource/OptimisticConcurrency.aspx"
title="Using Optimistic Concurrency"
description="Explore how to augment the SqlDataSource to include support for
optimistic concurrency." />
</siteMapNode>
После обновления Web.sitemap
просмотрите веб-сайт учебников через браузер. Меню слева теперь содержит элементы для редактирования, вставки и удаления учебников.
Рис. 5. Схема сайта теперь включает записи для учебников По SqlDataSource
Шаг 2. Добавление и настройка элемента управления SqlDataSource
Сначала откройте Querying.aspx
страницу в папке SqlDataSource
и перейдите в режим конструктора. Перетащите элемент управления SqlDataSource из панели элементов в конструктор и задайте для нее значение ID
ProductsDataSource
. Как и в объекте ObjectDataSource, sqlDataSource не создает отрисованные выходные данные и поэтому отображается как серый прямоугольник на поверхности конструктора. Чтобы настроить SqlDataSource, щелкните ссылку "Настройка источника данных" из смарт-тега SqlDataSource.
Рис. 6. Щелкните ссылку "Настройка источника данных" из смарт-тега SqlDataSource
Откроется мастер настройки источника данных элемента управления SqlDataSource. Хотя шаги мастера отличаются от элемента управления ObjectDataSource, конечная цель одинакова для предоставления сведений о том, как извлекать, вставлять, обновлять и удалять данные через источник данных. Для SqlDataSource это означает указание базовой базы данных для использования и предоставления нерегламентированных инструкций SQL или хранимых процедур.
Первый шаг мастера запрашивает у нас базу данных. Раскрывающийся список включает эти базы данных, найденные в папке веб-приложения App_Data
, и те, которые были добавлены в узел "Подключения к данным" в обозревателе серверов. Так как мы уже добавили строка подключения для NORTHWIND.MDF
базы данных в папке в App_Data
файл проектаWeb.config
, раскрывающийся список содержит ссылку на этот строка подключения. NORTHWINDConnectionString
Выберите этот элемент из раскрывающегося списка и нажмите кнопку "Далее".
Рис. 7. Выбор NORTHWINDConnectionString
из раскрывающегося списка
После выбора базы данных мастер запрашивает запрос на возврат данных. Можно указать столбцы таблицы или представления для возврата или ввести пользовательскую инструкцию SQL или указать хранимую процедуру. Вы можете переключаться между этим выбором с помощью настраиваемой инструкции SQL или хранимой процедуры и указания столбцов из таблицы или просмотра переключателей.
Примечание.
В этом первом примере давайте используем столбцы из таблицы или параметра представления. Далее мы вернемся к мастеру в этом руководстве и рассмотрим параметр "Указать настраиваемую инструкцию SQL" или параметр хранимой процедуры.
На рисунке 8 показан экран "Настройка инструкции выбора" при выборе столбцов из таблицы или переключателя просмотра. Раскрывающийся список содержит набор таблиц и представлений в базе данных Northwind с выбранными столбцами таблицы или представления, отображаемыми в списке флажков ниже. В этом примере давайте возвращаем ProductID
ProductName
столбцы из Products
таблицы, а также UnitPrice
столбцы. Как показано на рисунке 8, после выбора в мастере показана результирующая инструкция SELECT [ProductID], [ProductName], [UnitPrice] FROM [Products]
SQL.
Рис. 8. Возврат данных из Products
таблицы
После настройки мастера возвратить ProductID
ProductName
столбцы из UnitPrice
Products
таблицы нажмите кнопку "Далее". Этот окончательный экран предоставляет возможность проверить результаты запроса, настроенного на предыдущем шаге. Нажатие кнопки "Тестовый запрос" выполняет настроенную SELECT
инструкцию и отображает результаты в сетке.
Рис. 9. Нажмите кнопку "Тестовый запрос", чтобы просмотреть SELECT
запрос
Чтобы завершить работу мастера, нажмите кнопку Готово.
Как и при использовании ObjectDataSource, мастер SqlDataSource просто назначает значения свойствам элемента управления, а именно ConnectionString
свойствам и SelectCommand
свойствам. После завершения работы мастера декларативная разметка элемента управления SqlDataSource должна выглядеть следующим образом:
<asp:SqlDataSource ID="ProductsDataSource" runat="server"
ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
SelectCommand="SELECT [ProductID], [ProductName], [UnitPrice] FROM [Products]">
</asp:SqlDataSource>
Свойство ConnectionString
содержит сведения о том, как подключиться к базе данных. Это свойство можно назначить полное, жестко закодированное значение строка подключения или указать на строка подключения.Web.config
Чтобы ссылаться на значение строка подключения в Web.config, используйте синтаксис<%$ expressionPrefix:expressionValue %>
. Как правило, выражениеPrefix — ConnectionStrings и expressionValue — это имя строки подключения в<connectionStrings>
Web.config
разделе. Однако синтаксис можно использовать для ссылки на <appSettings>
элементы или содержимое из файлов ресурсов. Дополнительные сведения об этом синтаксисе см . в ASP.NET выражениях .
Свойство SelectCommand
задает нерегламентированный оператор SQL или хранимую процедуру для возврата данных.
Шаг 3. Добавление веб-элемента управления данными и привязка его к SqlDataSource
После настройки SqlDataSource его можно привязать к веб-элементу управления данными, например GridView или DetailsView. В этом руководстве мы рассмотрим данные в GridView. Из панели элементов перетащите GridView на страницу и привязать его к ProductsDataSource
SqlDataSource, выбрав источник данных из раскрывающегося списка в смарт-теге GridView.
Рис. 10. Добавление GridView и привязка его к элементу управления SqlDataSource (щелкните, чтобы просмотреть изображение полного размера)
После выбора элемента управления SqlDataSource из раскрывающегося списка в смарт-теге GridView Visual Studio автоматически добавит в GridView элемент Управления версиями данных в GridView или CheckBoxField. Так как SqlDataSource возвращает три столбца ProductID
базы данных, ProductName
а UnitPrice
в GridView есть три поля.
Чтобы настроить GridView в трех BoundFields, сделайте некоторое время. Измените ProductName
свойство поля на "Имя продукта" HeaderText
и UnitPrice
поле "Цена". Кроме того, UnitPrice
форматируйте поле как валюту. После внесения этих изменений декларативная разметка GridView должна выглядеть следующим образом:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
DataKeyNames="ProductID" DataSourceID="ProductsDataSource"
EnableViewState="False">
<Columns>
<asp:BoundField DataField="ProductID" HeaderText="ProductID"
InsertVisible="False" ReadOnly="True" SortExpression="ProductID" />
<asp:BoundField DataField="ProductName" HeaderText="Product Name"
SortExpression="ProductName" />
<asp:BoundField DataField="UnitPrice" HeaderText="Price"
SortExpression="UnitPrice" DataFormatString="{0:c}"
HtmlEncode="False" />
</Columns>
</asp:GridView>
Посетите эту страницу через браузер. Как показано на рисунке 11, GridView выводит список всех продуктов ProductID
ProductName
и UnitPrice
значений.
Рис. 11. GridView отображает каждый продукт ProductID
ProductName
и UnitPrice
значения (щелкните, чтобы просмотреть изображение полного размера)
При посещении страницы GridView вызывает метод управления версиями Select()
данных. Когда мы использовали элемент управления ObjectDataSource, это называется методом ProductsBLL
класса GetProducts()
. Однако при использовании SqlDataSource Select()
метод устанавливает соединение с указанной базой данных и выдает SelectCommand
(SELECT [ProductID], [ProductName], [UnitPrice] FROM [Products]
в этом примере). SqlDataSource возвращает результаты, которые затем перечисляет GridView, создавая строку в GridView для каждой возвращаемой записи базы данных.
Встроенные функции веб-элемента управления данными и элемент управления SqlDataSource
Как правило, функции, характерные для веб-элементов управления данными, разбиения, сортировки, редактирования, удаления, вставки и т. д. относятся к веб-элементу управления данными и не зависят от используемого элемента управления версиями данных. То есть GridView может использовать встроенные разбиения по страницам, сортировку, редактирование и удаление, привязанное к ObjectDataSource или SqlDataSource. Однако некоторые функции управления веб-данными чувствительны к используемой системе управления источниками данных или конфигурации системы управления версиями данных.
Например, в руководстве по эффективному просмотру больших объемов данных мы обсуждали, как по умолчанию логика разбиения по страницам для веб-элементов управления данными наивно возвращает все записи из базового источника данных, а затем отображает только соответствующую подмножество записей с учетом текущего индекса страницы и количества записей для отображения на странице. Эта модель очень неэффективна при разбиении по страницам через достаточно большие результирующие наборы. К счастью, ОбъектDataSource можно настроить для поддержки настраиваемого разбиения по страницам, который возвращает только точное подмножество записей для отображения. Однако элемент управления SqlDataSource не имеет свойств для реализации пользовательского разбиения на страницы.
Другая тонкость при разбиении по страницам и сортировке возникает с sqlDataSource. По умолчанию данные, возвращаемые из SqlDataSource, можно сортировать или сортировать по GridView. Чтобы продемонстрировать это, проверьте параметры включения разбиения по страницам и включите сортировку в смарт-теге Querying.aspx
GridView и убедитесь, что это работает должным образом.
Сортировка и разбиение по страницам работает, так как SqlDataSource извлекает данные базы данных в свободно типизированный набор данных. Общее количество записей, возвращаемых запросом, необходимое для реализации разбиения по страницам, можно определить из набора данных. Кроме того, результаты набора данных можно сортировать по DataView. Эти возможности автоматически используются SqlDataSource, когда GridView запрашивает страницы или отсортированные данные.
SqlDataSource можно настроить для возврата DataReader вместо набора данных, изменив его DataSourceMode
свойство с DataSet
(по умолчанию) DataReader
на . Использование DataReader может быть предпочтительнее в ситуациях при передаче результатов SqlDataSource в существующий код, который ожидает DataReader. Кроме того, поскольку DataReaders значительно проще объектов, чем Наборы данных, они обеспечивают более высокую производительность. Однако при внесении этого изменения веб-элемент управления данными не может отсортировать или страницу, так как SqlDataSource не может определить количество записей, возвращаемых запросом, и не предлагает методы сортировки возвращаемых данных.
Шаг 4. Использование пользовательской инструкции SQL или хранимой процедуры
При настройке элемента управления SqlDataSource запрос, используемый для возврата данных, можно указать в одном из двух подходов как настраиваемую инструкцию SQL или хранимую процедуру или как столбцы из существующей таблицы или представления. На шаге 2 мы рассмотрели выбор столбцов из Products
таблицы. Рассмотрим настраиваемую инструкцию SQL.
Добавьте другой элемент управления GridView на Querying.aspx
страницу и выберите создать новый источник данных из раскрывающегося списка в смарт-теге. Затем укажите, что данные будут извлечены из базы данных, при этом будет создан новый элемент управления SqlDataSource. Присвойте элементу управления ProductsWithCategoryInfoDataSource
имя.
Рис. 12. Создание элемента управления SqlDataSource с именем ProductsWithCategoryInfoDataSource
На следующем экране мы запрашиваем указать базу данных. Как мы вернулись на рис. 7, выберите NORTHWINDConnectionString
из раскрывающегося списка и нажмите кнопку "Далее". На экране "Настройка инструкции выбора" выберите пользовательскую инструкцию SQL или переключатель хранимой процедуры и нажмите кнопку "Далее". Откроется экран "Определение пользовательских инструкций" или "Хранимые процедуры", который предлагает вкладки SELECT, UPDATE, INSERT и DELETE. На каждой вкладке можно ввести настраиваемую инструкцию SQL в текстовое поле или выбрать хранимую процедуру из раскрывающегося списка. В этом руководстве мы рассмотрим ввод пользовательской инструкции SQL; В следующем руководстве приведен пример, использующий хранимую процедуру.
Рис. 13. Ввод пользовательской инструкции SQL или выбор хранимой процедуры
Пользовательская инструкция SQL может быть введена вручную в текстовое поле или можно создать графически, нажав кнопку построителя запросов. В построителе запросов или текстовом поле используйте следующий запрос, чтобы вернуть ProductID
поля ProductName
из Products
таблицы с помощью JOIN
средства извлечения продукта CategoryName
из Categories
таблицы:
SELECT Products.ProductID, Products.ProductName, Categories.CategoryName
FROM Categories
INNER JOIN Products ON
Categories.CategoryID = Products.CategoryID
Рис. 14. Вы можете графически создать запрос с помощью построителя запросов
После указания запроса нажмите кнопку "Далее", чтобы перейти к экрану тестового запроса. Нажмите кнопку "Готово", чтобы завершить работу мастера SqlDataSource.
После завершения работы мастера в GridView будет добавлено ProductID
ProductName
три BoundFields, отображающих столбцы, CategoryName
возвращаемые из запроса, и в результате чего выполняется следующая декларативная разметка:
<asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False"
DataKeyNames="ProductID" DataSourceID="ProductsWithCategoryInfoDataSource"
EnableViewState="False">
<Columns>
<asp:BoundField DataField="ProductID" HeaderText="ProductID"
InsertVisible="False" ReadOnly="True" SortExpression="ProductID" />
<asp:BoundField DataField="ProductName" HeaderText="ProductName"
SortExpression="ProductName" />
<asp:BoundField DataField="CategoryName" HeaderText="CategoryName"
SortExpression="CategoryName" />
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="ProductsWithCategoryInfoDataSource" runat="server"
ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
SelectCommand="
SELECT Products.ProductID, Products.ProductName, Categories.CategoryName
FROM Categories
INNER JOIN Products ON Categories.CategoryID = Products.CategoryID">
</asp:SqlDataSource>
Рис. 15. GridView показывает каждый идентификатор продукта, имя и связанное имя категории (щелкните, чтобы просмотреть изображение полного размера)
Итоги
В этом руководстве мы узнали, как запрашивать и отображать данные с помощью элемента управления SqlDataSource. Как и ObjectDataSource, SqlDataSource выступает в качестве прокси-сервера, предоставляя декларативный подход к доступу к данным. Его свойства указывают базу данных для подключения и выполнения SQL-запросаSELECT
; их можно указать с помощью окно свойств или с помощью мастера настройки DataSource.
Примеры SELECT
запросов, которые мы изучили в этом руководстве, вернули все записи из указанного запроса. Однако элемент управления SqlDataSource может включать WHERE
предложение с параметрами, значения которых назначаются программным способом или автоматически извлекаются из указанного источника. Мы рассмотрим, как создавать и использовать параметризованные запросы в следующем руководстве!
Счастливое программирование!
Дополнительные материалы
Дополнительные сведения о разделах, описанных в этом руководстве, см. в следующих ресурсах:
- Обзор элемента управления SqlDataSource
- Краткие руководства по ASP.NET: элемент управления SqlDataSource
- Элемент Web.config
<connectionStrings>
- Справочник по строке подключения к базе данных
Об авторе
Скотт Митчелл, автор семи книг ASP/ASP.NET и основатель 4GuysFromRolla.com, работает с технологиями Microsoft Web с 1998 года. Скотт работает независимым консультантом, тренером и писателем. Его последняя книга Сэмс Учит себя ASP.NET 2.0 в 24 часах. Он может быть достигнут в mitchell@4GuysFromRolla.com. или через его блог, который можно найти на http://ScottOnWriting.NET.
Особое спасибо
Эта серия учебников была проверена многими полезными рецензентами. Ведущие рецензенты для этого руководства были Сьюзан Коннери, Бернадетт Ли и Дэвид Суру. Хотите просмотреть мои предстоящие статьи MSDN? Если да, упадите меня линию в mitchell@4GuysFromRolla.com.