Запрос данных с помощью элемента управления SqlDataSource (VB)

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

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

В предыдущих руководствах мы использовали элемент управления 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 для вставки, обновления и удаления данных.

ASP.NET 2.0 включает пять встроенных элементов управления источниками данных

Рис. 1. ASP.NET 2.0 включает пять встроенных элементов управления источниками данных

Сравнение ObjectDataSource и SqlDataSource

Концептуально элементы управления ObjectDataSource и SqlDataSource — это просто прокси-серверы данных. Как описано в руководстве по отображению данных с помощью ObjectDataSource, объект ObjectDataSource имеет свойства, указывающие тип объекта, предоставляющий данные и методы для вызова для выбора, вставки, обновления и удаления данных из базового типа объекта. После настройки свойств ObjectDataSource, веб-элемент управления данными, такой как GridView, DetailsView или DataList, можно привязать к элементу управления, используя методы Select(), Insert(), Delete() и Update() для взаимодействия с базовой архитектурой.

SqlDataSource предоставляет те же функции, но работает с реляционной базой данных, а не с библиотекой объектов. С помощью SqlDataSource необходимо указать строку подключения к базе данных и временные SQL-запросы или хранимые процедуры для выполнения операций вставки, обновления, удаления и извлечения данных. Методы SqlDataSource Select(), Insert(), Update(), и Delete() при вызове подключаются к указанной базе данных и выполняют соответствующий SQL-запрос. Как показано на следующей схеме, эти методы выполняют работу по подключению к базе данных, выдаче запроса и возврату результатов.

SqlDataSource служит прокси-сервером базы данных

Рис. 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

Добавление страниц ASP.NET для учебников, связанных с SqlDataSource

Рис. 3. Добавление страниц ASP.NET для учебников, связанных с SqlDataSource

Как и в других папках, Default.aspx в папке SqlDataSource будет перечислять учебники в своем разделе. Помните, что элемент SectionLevelTutorialListing.ascx управления пользователем предоставляет эту функцию. Поэтому добавьте этот элемент управления пользователя Default.aspx, перетащив его из Проводника решений в режим проектирования страницы.

Добавьте элемент управления пользователем 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 просмотрите веб-сайт инструкций через браузер. Меню слева теперь содержит элементы для редактирования, вставки и удаления учебников.

Карта сайта теперь содержит записи для учебников по SqlDataSource

Рис. 5. Карта сайта теперь включает записи для учебников по SqlDataSource

Шаг 2. Добавление и настройка элемента управления SqlDataSource

Сначала откройте Querying.aspx страницу в папке SqlDataSource и перейдите в режим конструктора. Перетащите элемент управления SqlDataSource из панели Toolbox в конструктор Designer и установите его ID в ProductsDataSource. Как и в объекте ObjectDataSource, SqlDataSource не создает отрисованные выходные данные и поэтому отображается как серый прямоугольник на поверхности конструктора. Чтобы настроить SqlDataSource, щелкните ссылку "Настройка источника данных" из смарт-тега SqlDataSource.

Щелкните ссылку

Рис. 6. Щелкните ссылку "Настройка источника данных" из смарт-тега SqlDataSource

Откроется мастер настройки источника данных элемента управления SqlDataSource. Хотя шаги мастера отличаются от элемента управления ObjectDataSource, конечная цель одинакова для предоставления сведений о том, как извлекать, вставлять, обновлять и удалять данные через источник данных. Для SqlDataSource это означает указание исходной базы данных, которую следует использовать, и предоставление произвольных SQL-запросов или хранимых процедур.

Первый шаг мастера предлагает указать базу данных. Раскрывающийся список включает эти базы данных, найденные в папке веб-приложения App_Data , и те, которые были добавлены в узел "Подключения к данным" в обозревателе серверов. Поскольку мы уже добавили строку подключения для базы данных NORTHWIND.MDF в файл проекта Web.config в папке App_Data, раскрывающийся список содержит ссылку на эту строку подключения. NORTHWINDConnectionString Выберите этот элемент из раскрывающегося списка и нажмите кнопку "Далее".

Выберите NORTHWINDConnectionString из раскрывающегося списка

Рис. 7: Выберите NORTHWINDConnectionString из раскрывающегося списка

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

Примечание.

В этом первом примере давайте используем параметр "Указание столбцов из таблицы или представления". Позже в этом руководстве мы вернемся к мастеру и рассмотрим параметр "Указать настраиваемую инструкцию SQL или хранимую процедуру".

На рисунке 8 показан экран "Настройка инструкции выбора" при выборе радиокнопки "Указать столбцы из таблицы или представления". Раскрывающийся список содержит набор таблиц и представлений в базе данных Northwind, при этом столбцы выбранной таблицы или представления отображаются в списке флажков ниже. В этом примере давайте вернем столбцы ProductID, ProductName и UnitPrice из таблицы Products. Как показано на рисунке 8, мастер показывает результирующий SQL-запрос SELECT [ProductID], [ProductName], [UnitPrice] FROM [Products] после выбора.

Возврат данных из таблицы продуктов

Рис. 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 %>. Как правило, префиксВыражения — это ConnectionStrings, а значениеВыражения — это имя строки подключения в Web.config<connectionStrings>разделе. Однако синтаксис можно использовать для ссылки на <appSettings> элементы или содержимое из файлов ресурсов. Дополнительные сведения об этом синтаксисе см. в разделе Обзор выражений ASP.NET.

Свойство SelectCommand задает временный оператор SQL или хранимую процедуру, которые необходимо выполнить для возврата данных.

Шаг 3. Добавление веб-элемента управления данными и привязка его к SqlDataSource

После настройки SqlDataSource его можно привязать к веб-элементу управления данными, например GridView или DetailsView. В этом руководстве мы рассмотрим данные в GridView. Из панели элементов перетащите GridView на страницу и привяжите его к ProductsDataSource SqlDataSource, выбрав источник данных из раскрывающегося списка в смарт-теге GridView.

Добавление GridView и привязка его к элементу управления SqlDataSource

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

После выбора SqlDataSource из раскрывающегося списка в смарт-теге GridView, Visual Studio автоматически добавит в GridView поле BoundField или CheckBoxField для каждого из столбцов, возвращаемых элементом управления источником данных. Так как SqlDataSource возвращает три столбца ProductIDбазы данных, ProductNameа UnitPrice в GridView есть три поля.

Найдите время, чтобы настроить три BoundFields в GridView. Измените свойство ProductName поля на "Имя продукта" и свойство 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 выводит список всех продуктов ProductIDProductNameи UnitPrice значений.

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. Однако некоторые функции веб-управления данными чувствительны к используемому управлению источниками данных или к его конфигурации.

Например, в руководстве по эффективному просмотру больших объемов данных мы обсуждали, как по умолчанию логика разбиения по страницам для веб-элементов управления данными наивно возвращает все записи из базового источника данных, а затем отображает только соответствующую подмножество записей с учетом текущего индекса страницы и количества записей для отображения на странице. Эта модель очень неэффективна при пролистывании достаточно больших результатов. К счастью, ObjectDataSource можно настроить для поддержки пользовательской разбивки на страницы, которая возвращает только определённое подмножество записей для отображения. Однако элемент управления SqlDataSource не имеет свойств для реализации пользовательского разбиения на страницы.

Другая тонкость при разбиении на страницы и сортировке возникает с SqlDataSource. По умолчанию данные, возвращаемые из SqlDataSource, можно разбивать на страницы и сортировать с помощью GridView. Чтобы продемонстрировать это, проверьте параметры включения разбиения по страницам и включите сортировку в смарт-теге Querying.aspx GridView и убедитесь, что это работает должным образом.

Сортировка и разбиение по страницам работает, так как SqlDataSource извлекает данные базы данных в свободно типизированный набор данных. Общее количество записей, возвращаемых запросом, необходимое для реализации разбиения по страницам, можно определить из набора данных. Кроме того, результаты набора данных можно сортировать по DataView. Эти возможности автоматически используются SqlDataSource, когда GridView запрашивает страницы или отсортированные данные.

SqlDataSource можно настроить так, чтобы он возвращал DataReader вместо DataSet, изменив его DataSourceMode свойство с DataSet (по умолчанию) на DataReader. Использование DataReader может быть предпочтительнее в ситуациях при передаче результатов SqlDataSource в существующий код, который ожидает DataReader. Кроме того, поскольку DataReaders значительно проще объектов, чем Наборы данных, они обеспечивают более высокую производительность. Однако при внесении этого изменения веб-элемент управления данными не может ни отсортировать, ни осуществлять постраничную навигацию, так как SqlDataSource не может установить количество записей, возвращаемых запросом, также DataReader не предоставляет методы сортировки возвращаемых данных.

Шаг 4. Использование пользовательской инструкции SQL или хранимой процедуры

При настройке элемента управления SqlDataSource запрос, используемый для возврата данных, можно указать в одном из двух подходов как настраиваемую инструкцию SQL или хранимую процедуру или как столбцы из существующей таблицы или представления. На шаге 2 мы рассмотрели выбор столбцов из Products таблицы. Рассмотрим настраиваемую инструкцию SQL.

Добавьте ещё один элемент управления GridView на Querying.aspx страницу и выберите создание нового источника данных из раскрывающегося списка в смарт-теге. Затем укажите, что данные будут извлечены из базы данных, при этом будет создан новый элемент управления SqlDataSource. Присвойте элементу управления ProductsWithCategoryInfoDataSourceимя.

Создание нового элемента управления SqlDataSource с именем ProductsWithCategoryInfoDataSource

Рис. 12. Создание элемента управления SqlDataSource с именем ProductsWithCategoryInfoDataSource

На следующем экране мы запрашиваем указать базу данных. Как мы делали это ранее на рис. 7, выберите NORTHWINDConnectionString из раскрывающегося списка и нажмите кнопку "Далее". На экране "Настройка инструкции SELECT" выберите вариант "Указать пользовательскую инструкцию SQL или хранимую процедуру" и нажмите кнопку "Далее". Откроется экран "Определение пользовательских инструкций" или "Хранимые процедуры", который предлагает вкладки SELECT, UPDATE, INSERT и DELETE. На каждой вкладке можно ввести настраиваемую инструкцию SQL в текстовое поле или выбрать хранимую процедуру из раскрывающегося списка. В этом руководстве мы рассмотрим ввод пользовательской инструкции 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 будут добавлены три BoundFields, отображающие столбцы, возвращаемые из запроса ProductID, ProductName, и 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>

GridView показывает каждый идентификатор продукта, имя и связанное имя категории

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

Итоги

В этом руководстве мы узнали, как запрашивать и отображать данные с помощью элемента управления SqlDataSource. Как и ObjectDataSource, SqlDataSource выступает в качестве прокси-сервера, предоставляя декларативный подход к доступу к данным. Его свойства указывают базу данных для подключения и выполнения SQL-запросаSELECT; их можно указать с помощью окно свойств или с помощью мастера настройки DataSource.

Примеры SELECT запросов, которые мы изучили в этом руководстве, вернули все записи из указанного запроса. Однако элемент управления SqlDataSource может включать WHERE предложение с параметрами, значения которых назначаются программным способом или автоматически извлекаются из указанного источника. Мы рассмотрим, как создавать и использовать параметризованные запросы в следующем руководстве!

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

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

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

Об авторе

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

Особое спасибо кому

Эта серия учебников была проверена многими полезными рецензентами. Главные рецензенты этого руководства: Сьюзан Коннери, Бернадетт Ли и Дэвид Суру. Хотите просмотреть мои предстоящие статьи MSDN? Если да, напишите мне на mitchell@4GuysFromRolla.com.