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

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

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

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

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

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

Рис. 2. SqlDataSource выступает в качестве прокси-сервера для базы данных

Note

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

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

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

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

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

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

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

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

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

Note

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

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

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

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

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

Нажмите кнопку проверить запрос, чтобы проверить запрос SELECT.

Рис. 9. нажатие кнопки "проверить запрос" для просмотра SELECT запроса

Чтобы завершить работу мастера, нажмите кнопку Готово.

Как и в случае с ObjectDataSource, мастер SqlDataSource s просто присваивает значения свойствам Control s, а именно 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 %>. Обычно експрессионпрефикс — это ConnectionString, а експрессионвалуе — имя строки подключения в разделе Web.config``<connectionStrings>. Однако синтаксис можно использовать для ссылки на <appSettings> элементы или содержимое из файлов ресурсов. Подробнее об этом синтаксисе см. в разделе Общие сведения о выражениях ASP.NET .

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

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

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

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

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

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

Уделите несколько минут настройке трех BoundFields в GridView s. Измените ProductName поля HeaderText свойства на имя продукта и на UnitPrice поле s на Price. Также Отформатируйте поле UnitPrice как валюту. После внесения этих изменений декларативная разметка GridView s должна выглядеть следующим образом:

<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. Отображение каждого продукта с ProductID, ProductNameи UnitPrice значений (щелкните,чтобы просмотреть изображение с полным размером)

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

Встроенные функции веб-элементов управления данными и элемент управления SqlDataSource

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

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

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

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

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

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

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

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

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

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

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

Поздравляем с программированием!

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

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

Об авторе

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

Специальная благодарность

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