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


Запрос данных с помощью элемента управления 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, можно привязать к элементу управления, используя методы ObjectDataSource , 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 пользователем, перетащив его из Обозреватель решений в представление конструктора страницы.

Добавьте элемент управления user Control 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 из панели элементов в конструктор и задайте для нее значение ID ProductsDataSource. Как и в объекте ObjectDataSource, sqlDataSource не создает отрисованные выходные данные и поэтому отображается как серый прямоугольник на поверхности конструктора. Чтобы настроить SqlDataSource, щелкните ссылку "Настройка источника данных" из смарт-тега SqlDataSource.

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

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

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

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

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

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

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

Примечание.

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

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

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

Рис. 8. Возврат данных из Products таблицы

После настройки мастера возвратить ProductIDProductNameстолбцы из 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.

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

Рис. 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 выводит список всех продуктов ProductIDProductNameи UnitPrice значений.

GridView отображает значения ProductID, ProductName и UnitPrice каждого продукта

Рис. 11. GridView отображает каждый продукт ProductIDProductNameи 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имя.

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

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

На следующем экране мы запрашиваем указать базу данных. Как мы вернулись на рис. 7, выберите NORTHWINDConnectionString из раскрывающегося списка и нажмите кнопку "Далее". На экране "Настройка инструкции выбора" выберите пользовательскую инструкцию 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 будет добавлено ProductIDProductNameтри 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>

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

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

Итоги

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

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

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

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

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

Об авторе

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

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

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