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


Выбор данных с помощью элемента управления SqlDataSource

Обновлен: Ноябрь 2007

Элемент управления SqlDataSource можно использовать для извлечения данных из базы данных с помощью небольшого кода или без использования кода. Элемент управления SqlDataSource может работать с любой базой данных, связанной с поставщиком ADO.NET, настроенным в разделе DbProviderFactories конфигурации, включая Microsoft SQL Server, Oracle, ODBC или базы данных OLE DB, такие как Microsoft Access. От используемой базы данных зависит синтаксис инструкций SQL, настроенных для использования SqlDataSource, и от того, можно ли использовать расширенные возможности базы данных, такие как хранимые процедуры. Однако элемент управления источника базы данных действует одинаково для всех баз данных.

Чтобы извлечь данные из базы данных с помощью элемента управления SqlDataSource, необходимо задать, по меньшей мере, следующие свойства:

  • ProviderName   Задает имя поставщика ADO.NET, представляющего используемую базу данных. При работе с Microsoft SQL Server установите для свойства ProviderName значение «System.Data.SqlClient»; при работе с базой данных Oracle установите для свойства ProviderName значение «System.Data.OracleClient»; и т.д.

  • ConnectionString   Задает строку подключения для работы с базой данных.

  • SelectCommand   Задает запрос SQL или хранимую процедуру, которая возвращает данные из базы данных. Запрос, заданный для свойства SelectCommand, является тем же запросом, который задан для свойства CommandText объекта IDbCommand ADO.NET при написании кода доступа к данным ADO.NET. Фактический синтаксис запроса SQL зависит от схемы данных и используемой базы данных.

Эти свойства описаны более подробно в следующих подразделах.

Указание имени поставщика

Присвойте свойству ProviderName имя поставщика ADO.NET, связанного с типом базы данных, в которой хранятся данные. Список разрешенных поставщиков регистрируется в разделе DbProviderFactories файла конфигурации — Machine.config или Web.config. По умолчанию элемент управления SqlDataSource использует поставщик ADO.NET System.Data.SqlClient, соответствующий Microsoft SQL Server. Поэтому при подключении к базе данных SQL Server не требуется явно указывать поставщик. Однако можно также указать поставщики System.Data.OracleClient, System.Data.Odbc или System.Data.OleDb. Дополнительные сведения см. в разделе ADO.NET.

w1kdt8w2.alert_note(ru-ru,VS.90).gifПримечание.

Не присваивайте свойству ProviderName значение неуправляемого поставщика ADO.NET, такое как SQLOLEDB или MSDAORA.

Указание строки подключения

Задайте свойство ConnectionString строке подключения, используемой для отдельной базы данных. Однако установка свойства ConnectionString элемента управления SqlDataSource для определения строки подключения — не самая лучшая стратегия для крупных веб-узлов. Кроме того, в этом случае строка подключения сохраняется как обычный текст на странице ASP.NET. Для обеспечения большей поддержки и безопасности веб-приложения рекомендуется сохранять строки подключений в элементе connectionStrings в файле конфигурации приложения. Затем можно добавить ссылку на сохраненную строку подключения с помощью выражения подключения, как в следующем примере:

<asp:SqlDataSource 
  ID="SqlDataSource1" 
  runat="server" 
  ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>"
   SelectCommand="SELECT * FROM [Categories]">
</asp:SqlDataSource>

Для дополнительной безопасности можно зашифровать содержимое раздела конфигурации <connectionStrings>. Дополнительные сведения см. в разделе Шифрование и расшифровка разделов конфигурации.

Указание команды выбора

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

SELECT LastName FROM Employees;

В следующем примере кода показано, как можно задать свойства ConnectionString и SelectCommand элемента управления SqlDataSource для отображения данных «Employees» в элементе управления GridView:

<%@ Page language="VB" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head runat="server">
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" runat="server">
      <asp:SqlDataSource
          id="SqlDataSource1"
          runat="server"
          DataSourceMode="DataReader"
          ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
          SelectCommand="SELECT LastName FROM Employees">
      </asp:SqlDataSource>

      <asp:ListBox
          id="ListBox1"
          runat="server"
          DataTextField="LastName"
          DataSourceID="SqlDataSource1">
      </asp:ListBox>

    </form>
  </body>
</html>
<%@ Page language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head runat="server">
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" runat="server">
      <asp:SqlDataSource
          id="SqlDataSource1"
          runat="server"
          DataSourceMode="DataReader"
          ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
          SelectCommand="SELECT LastName FROM Employees">
      </asp:SqlDataSource>

      <asp:ListBox
          id="ListBox1"
          runat="server"
          DataTextField="LastName"
          DataSourceID="SqlDataSource1">
      </asp:ListBox>

    </form>
  </body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head runat="server">
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" runat="server">
      <asp:SqlDataSource
          id="SqlDataSource1"
          runat="server"
          DataSourceMode="DataReader"
          ConnectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;"
          SelectCommand="SELECT LastName FROM Employees">
      </asp:SqlDataSource>

      <asp:ListBox
          id="ListBox1"
          runat="server"
          DataTextField="LastName"
          DataSourceID="SqlDataSource1">
      </asp:ListBox>

    </form>
  </body>
</html>

Если база данных, с которой выполняется работа, поддерживает хранимые процедуры, для свойства SelectCommand можно задать имя хранимой процедуры и StoredProcedure свойства SelectCommandType, чтобы указать, что свойство SelectCommand ссылается на хранимую процедуру. В следующем примере показана простая хранимая процедура, которую можно создать в SQL Server:

CREATE PROCEDURE sp_GetAllEmployees AS
    SELECT * FROM Employees;
GO

Чтобы настроить SqlDataSource для использования этой хранимой процедуры, задайте для SelectCommand текст «sp_GetAllEmployees» и для свойства SelectCommandType значение StoredProcedure.

Большинство хранимых процедур используют параметры. Дополнительные сведения об использовании хранимых процедур с параметрами см. в разделе Использование параметров с элементом управления SqlDataSource.

Во время выполнения элемент управления SqlDataSource отправляет текст в свойстве SelectCommand в базу данных, и база данных возвращает результат запроса или хранимую процедуру в элемент управления SqlDataSource. Любые веб-элементы управления, привязанные к элементу управления источника данных, отображают набор результатов на странице ASP.NET.

Передача параметров в инструкции SQL

Пользователи часто взаимодействуют с данными на основе параметров, которые можно разрешить или вычислить только во время выполнения. Например, данные, отображенные на веб-странице ASP.NET, могут представлять отчет для отдельной даты. Если пользователь выбирает другую дату, данные в отчете также могут измениться. Независимо от того, изменены данные явно пользователем или программно веб-приложением, отправляемый в базу данных запрос SQL можно сделать более гибким и управляемым, если он параметризован, элементы инструкции SQL в котором привязаны к переменным веб-приложения и вычисляются во время выполнения.

Элемент управления SqlDataSource поддерживает параметризованные запросы SQL посредством связывания параметров, добавляемых к коллекции SelectParameters с помощью прототипов в запросе SelectCommand. Значения параметров можно считывать из другого элемента управления на странице, из состояния сеанса, из профиля пользователя и из других элементов. Дополнительные сведения см. в разделе Использование параметров с элементом управления SqlDataSource.

Синтаксис, используемый для переменных заполнителей, зависит от типа базы данных. При работе с SQL Server имя параметра начинается со знака «@» и соответствует имени объекта Parameter в коллекции SelectParameters. При работе с базой данных ODBC или OLE DB параметры в параметризованном операторе не именуются и вместо этого указаны с помощью знака заполнителя «?».

В следующем примере показано, как параметризованный запрос SQL извлекает все заказы в базе данных SQL Server Northwind на основе идентификатора вошедшего в систему сотрудника.

SELECT * FROM Orders WHERE EmployeeID = @empid

В этом примере выражение @empid является параметром, который вычисляется во время выполнения.

В следующем примере кода показан параметризованный запрос SQL, получающий значение параметра из другого элемента управления на странице.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
  <head runat="server">
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" runat="server">

      <p><asp:dropdownlist
          id="DropDownList1"
          runat="server"
          autopostback="True">
          <asp:listitem selected="True">Sales Representative</asp:listitem>
          <asp:listitem>Sales Manager</asp:listitem>
          <asp:listitem>Vice President, Sales</asp:listitem>
      </asp:dropdownlist></p>

      <asp:sqldatasource
          id="SqlDataSource1"
          runat="server"
          connectionstring="<%$ ConnectionStrings:MyNorthwind%>"
          selectcommand="SELECT LastName FROM Employees WHERE Title = @Title">
          <selectparameters>
              <asp:controlparameter name="Title" controlid="DropDownList1" propertyname="SelectedValue"/>
          </selectparameters>
      </asp:sqldatasource>

      <p><asp:listbox
          id="ListBox1"
          runat="server"
          datasourceid="SqlDataSource1"
          datatextfield="LastName">
      </asp:listbox></p>

    </form>
  </body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
  <head runat="server">
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" runat="server">

      <p><asp:dropdownlist
          id="DropDownList1"
          runat="server"
          autopostback="True">
          <asp:listitem selected="True">Sales Representative</asp:listitem>
          <asp:listitem>Sales Manager</asp:listitem>
          <asp:listitem>Vice President, Sales</asp:listitem>
      </asp:dropdownlist></p>

      <asp:sqldatasource
          id="SqlDataSource1"
          runat="server"
          connectionstring="<%$ ConnectionStrings:MyNorthwind%>"
          selectcommand="SELECT LastName FROM Employees WHERE Title = @Title">
          <selectparameters>
              <asp:controlparameter name="Title" controlid="DropDownList1" propertyname="SelectedValue"/>
          </selectparameters>
      </asp:sqldatasource>

      <p><asp:listbox
          id="ListBox1"
          runat="server"
          datasourceid="SqlDataSource1"
          datatextfield="LastName">
      </asp:listbox></p>

    </form>
  </body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
  <head runat="server">
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" runat="server">

      <p><asp:DropDownList
          id="DropDownList1"
          runat="server"
          AutoPostBack="True">
          <asp:ListItem Selected="True">Sales Representative</asp:ListItem>
          <asp:ListItem>Sales Manager</asp:ListItem>
          <asp:ListItem>Vice President, Sales</asp:ListItem>
      </asp:DropDownList></p>

      <asp:SqlDataSource
          id="SqlDataSource1"
          runat="server"
          ConnectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;"
          SelectCommand="SELECT LastName FROM Employees WHERE Title = @Title">
          <SelectParameters>
              <asp:ControlParameter Name="Title" ControlId="DropDownList1" PropertyName="SelectedValue"/>
          </SelectParameters>
      </asp:SqlDataSource>

      <p><asp:ListBox
          id="ListBox1"
          runat="server"
          DataSourceID="SqlDataSource1"
          DataTextField="LastName">
      </asp:ListBox></p>

    </form>
  </body>
</html>

Дополнительные сведения об использовании параметров с элементом управления SqlDataSource см. в разделе Использование параметров с элементом управления SqlDataSource. Дополнительные общие сведения об использовании параметров источника данных см. в разделе Использование параметров с элементами управления источников данных.

Указание порядка возвращения данных

Свойство DataSourceMode элемента управления SqlDataSource определяет, как данные обрабатываются элементом управления SqlDataSource. По умолчанию для свойства DataSourceMode установлено значение DataSet — это означает, что набор результатов, возвращаемый из базы данных, сохраняется в памяти сервера элементом управления SqlDataSource. Когда элемент управления SqlDataSource извлекает данные в режиме DataSet, связанные элементы управления привязки данных, например, GridView и DetailsView, могут предлагать широкие возможности отображения данных, такие как автоматическая сортировка и разбиение по страницам.

Дополнительно можно установить для свойства DataSourceMode значение DataReader — в этом случае, набор результатов не будет сохраняться в памяти. Для сценариев, в которых не требуется сохранять набор результатов в памяти на сервере, используйте режим DataReader.

В следующем примере кода показано, как задать для свойства DataSourceMode элемента управления SqlDataSource значение DataReader в сценарии, не требующим сортировки, разбиения по страницам или фильтрации.

<%@ Page language="VB" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head runat="server">
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" runat="server">
      <asp:SqlDataSource
          id="SqlDataSource1"
          runat="server"
          DataSourceMode="DataReader"
          ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
          SelectCommand="SELECT LastName FROM Employees">
      </asp:SqlDataSource>

      <asp:ListBox
          id="ListBox1"
          runat="server"
          DataTextField="LastName"
          DataSourceID="SqlDataSource1">
      </asp:ListBox>

    </form>
  </body>
</html>
<%@ Page language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head runat="server">
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" runat="server">
      <asp:SqlDataSource
          id="SqlDataSource1"
          runat="server"
          DataSourceMode="DataReader"
          ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
          SelectCommand="SELECT LastName FROM Employees">
      </asp:SqlDataSource>

      <asp:ListBox
          id="ListBox1"
          runat="server"
          DataTextField="LastName"
          DataSourceID="SqlDataSource1">
      </asp:ListBox>

    </form>
  </body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head runat="server">
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" runat="server">
      <asp:SqlDataSource
          id="SqlDataSource1"
          runat="server"
          DataSourceMode="DataReader"
          ConnectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;"
          SelectCommand="SELECT LastName FROM Employees">
      </asp:SqlDataSource>

      <asp:ListBox
          id="ListBox1"
          runat="server"
          DataTextField="LastName"
          DataSourceID="SqlDataSource1">
      </asp:ListBox>

    </form>
  </body>
</html>

Добавление пользовательской обработки с помощью событий элемента управления SqlDataSource

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

Элемент управления SqlDataSource создает событие Selecting до того, как вызовет метод Select для выполнения набора запросов SQL в свойстве SelectCommand. Можно обработать событие Selecting, чтобы проверить запрос SQL перед его выполнением, проверить параметры, которые содержатся в коллекции SelectParameters, или выполнить любые дополнительные действия до извлечения данных. Например, если используется FormParameter с элементом управления SqlDataSource, можно обработать событие Selecting для проверки значения параметра перед извлечением данных. (Объект FormParameter принимает значение, переданное в элементе HTML, и передает его в базу данных без какой-либо проверки.) Если значение не допустимо, можно отменить запрос, присвоив свойству Cancel объекта SqlDataSourceSelectingEventArgs значение true.

Элемент управления SqlDataSource создает событие Selected после извлечения данных. Можно обработать событие Selected, чтобы определить, было ли исключение вызвано во время операции с базой данных, или проверить любые значения, возвращенные операцией с данными.

Отображение данных

Для отображения данных на странице ASP.NET используйте элемент управления привязки данных, такой как GridView, DetailsView или FormView, или элементы управления, такие как ListBox или DropDownList. Элемент управления привязки данных действует как потребитель данных, которые извлекает элемент управления SqlDataSource. Установите для свойства DataSourceID элемента управления привязки данных значение идентификатора элемента управления SqlDataSource. При подготовке отображения страницы элемент управления SqlDataSource извлекает данные и делает их доступными для элемента управления привязки данных, который, в свою очередь, отображает данные. Дополнительные сведения об элементах управления привязки данных и об их использовании с элементами управления источников данных см. в разделе Общие сведения о серверных веб-элементах управления ASP.NET с привязкой к данным.

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

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head runat="server">
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" runat="server">

      <asp:SqlDataSource
          id="SqlDataSource1"
          runat="server"
          DataSourceMode="DataReader"
          ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
          SelectCommand="SELECT FirstName, LastName, Title FROM Employees">
      </asp:SqlDataSource>

      <asp:GridView
          id="GridView1"
          runat="server"
          DataSourceID="SqlDataSource1">
      </asp:GridView>

    </form>
  </body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head runat="server">
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" runat="server">

      <asp:SqlDataSource
          id="SqlDataSource1"
          runat="server"
          DataSourceMode="DataReader"
          ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
          SelectCommand="SELECT FirstName, LastName, Title FROM Employees">
      </asp:SqlDataSource>

      <asp:GridView
          id="GridView1"
          runat="server"
          DataSourceID="SqlDataSource1">
      </asp:GridView>

    </form>
  </body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head runat="server">
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" runat="server">

      <asp:SqlDataSource
          id="SqlDataSource1"
          runat="server"
          DataSourceMode="DataReader"
          ConnectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;"
          SelectCommand="SELECT FirstName, LastName, Title FROM Employees">
      </asp:SqlDataSource>

      <asp:GridView
          id="GridView1"
          runat="server"
          DataSourceID="SqlDataSource1">
      </asp:GridView>

    </form>
  </body>
</html>

См. также

Основные понятия

Общие сведения о серверном веб-элементе управления SqlDataSource