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

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

Загрузить 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 включает пять Built-In элементов управления источником данных

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

Сравнение 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 master:

  • Default.aspx
  • Querying.aspx
  • ParameterizedQueries.aspx
  • InsertUpdateDelete.aspx
  • OptimisticConcurrency.aspx

Добавление страниц ASP.NET для учебников по SqlDataSource-Related

Рис. 3. Добавление страниц ASP.NET для учебников по SqlDataSource-Related

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

Щелкните настройка Source Link данных в смарт-теге SqlDataSource.

Рис. 6. Щелкните Source Link Configure Data (Настройка данных) в смарт-теге SqlDataSource

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

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

Выберите NORTHWINDConnectionString из списка Drop-Down.

Рис. 7. Выбор из NORTHWINDConnectionString списка Drop-Down

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

Примечание

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

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

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

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

Настроив мастер для возврата ProductIDстолбцов , ProductNameи UnitPrice из Products таблицы, нажмите кнопку Далее. Этот последний экран позволяет изучить результаты запроса, настроенного на предыдущем шаге. Нажатие кнопки Тестовый запрос выполняет настроенную SELECT инструкцию и отображает результаты в сетке.

Нажмите кнопку Test Query (Тестировать запрос), чтобы просмотреть запрос 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 %>. Как правило, expressionPrefix имеет значение ConnectionStrings, а expressionValue — это имя строки подключения в 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 автоматически добавит BoundField или CheckBoxField в GridView для каждого столбца, возвращаемого элементом управления источником данных. Так как SqlDataSource возвращает три столбца ProductIDбазы данных , ProductNameи UnitPrice в GridView есть три поля.

Уделите немного времени, чтобы настроить три Поля BoundField для GridView. Измените ProductName свойство поля HeaderText на Product Name(Название продукта), а UnitPrice поле s — на Price. Кроме того, отформатируйте 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 каждого продукта.

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

Рис. 11. GridView отображает значения каждого продукта ProductID, ProductNameи UnitPrice (щелкните для просмотра полноразмерного изображения)

При посещении страницы GridView вызывает метод своего элемента управления Select() источником данных. Когда мы использовали элемент управления ObjectDataSource, это вызывало ProductsBLL метод класса s GetProducts() . Однако при использовании SqlDataSource Select() метод устанавливает соединение с указанной базой данных и выдает SelectCommand (SELECT [ProductID], [ProductName], [UnitPrice] FROM [Products]в этом примере). SqlDataSource возвращает свои результаты, которые затем перечисляет GridView, создавая строку в GridView для каждой возвращаемой записи базы данных.

Функции веб-элемента управления Built-In data и элемент управления SqlDataSource

Как правило, функции веб-элементов управления данными подкачки, сортировки, редактирования, удаления, вставки и т. д. относятся к веб-элементу управления данными и не зависят от используемого элемента управления источником данных. То есть GridView может использовать встроенные возможности разбиения на страницы, сортировки, редактирования и удаления независимо от того, привязан ли он к ObjectDataSource или SqlDataSource. Однако некоторые функции веб-элемента управления данными чувствительны к используемому элементу управления источником данных или конфигурации системы управления источником данных.

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

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

Сортировка и разбиение по страницам работают, так как SqlDataSource извлекает данные базы данных в набор данных слабого типа. Общее количество записей, возвращаемых запросом, что является важным аспектом реализации разбиения по страницам, можно определить из DataSet. Кроме того, результаты DataSet можно отсортировать по 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 будут добавлены три Поля BoundField, отображающие ProductIDстолбцы , и CategoryName , ProductNameвозвращенные из запроса, и в результате чего будет получена следующая декларативная разметка:

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

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

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

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

Об авторе

Скотт Митчелл( Scott Mitchell), автор семи книг ASP/ASP.NET и основатель 4GuysFromRolla.com, работает с веб-технологиями Майкрософт с 1998 года. Скотт работает независимым консультантом, тренером и писателем. Его последняя книга Sams Teach Yourself ASP.NET 2.0 в 24 часах. Он может быть доступен в mitchell@4GuysFromRolla.com. или через его блог, который можно найти по адресу http://ScottOnWriting.NET.

Особая благодарность

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