Доступ к информации базы данных в ASP.NET 2.0 - Получаем данные из элемента управления SqlDataSource

ОГЛАВЛЕНИЕ


Получаем данные из элемента управления SqlDataSource

Обычно при осуществлении доступа к информации базы данных мы хотим каким-то образом отобразить или обработать результат. Чтобы просто отобразить информацию, используйте любой элемент управления данными (к примеру, GridView) и установите его свойство DataSourceID в ID элемента SqlDataSource. (Это легче всего сделать посредством смарт-тега элемента управления данными в режиме просмотра Design. Там вы найдете выпадающий список, где вы можете выбрать элемент SqlDataSource, с которым нужно связать элемент управления данными.) Когда страница будет посещена, элемент управления данными автоматически получит данные из связанного с ним элемента SqlDataSource и отобразит результат. Пример вы можете загрузить в конце данной статьи. Следующее изображение демонстрирует GridView при отображении колонок ProductID, ProductName, UnitPrice и UnitsInStock из таблицы Products , которая была отсортирована в возрастающем порядке по колонке UnitPrice , и второстепенной сортировкой по ProductNamе.


Вы также можете программно осуществить доступ к содержимому элемента SqlDataSource и работать с данными в коде. До того как мы перейдем к этому, давайте рассмотрим, как информация возвращается из базы данных элементом SqlDataSource. Если вы знакомы с доступом к данным в ASP.NET версии 1.x , то вы знаете, что существуют две техники/объекта для работы с данными:

  • DataReaders - предлагают доступный только для чтения доступ к базе данных, требует наличие активного соединения. Более продуктивен чем DataSets/DataTables/DataViews.
  • DataSet/DataTable/DataView - DataTable предлагает свободный доступ, настраиваемое представление запроса. DataSet является набором DataTables. DataViews может быть использовано для получения фильтрованного или сортированного набора записей в DataTable.

Элемент SqlDataSource может вернуть DataSet либо DataReader. Вы можете это настроить при помощи свойства DataSourceMode SqlDataSource, где DataSet установлен по умолчанию. Для того чтобы использовать сортировку и листание в GridView, или возможность кэширования SqlDataSource вам нужно получить DataSet от SqlDataSource. (Элемент AccessDataSource также имеет свойство DataSourceMode.)

Чтобы программно получить доступ к содержимому элемента SqlDataSource, вызовите метод Select() . Данный метод предполагает наличие единого входного параметра типа DataSourceSelectArguments. Данный параметр может быть использован для передачи запросамии к SqlDataSource для посылки информации до ее возврата. К примеру, работая с сортирующим GridView, сортировка колонки вызывает метод Select(), передавая экземпляр DataSourceSelectArguments с его свойством SortExpression, установленным в названии той колонки, которую пользователь выбрал для сортировки. Если вы не хотите, чтобы SqlDataSource производил сортировку, фильтрацию или возвращал только "страницу" данных, просто передайте DataSourceSelectArguments.Empty, как это показано в следующем коде.

Метод Select() возвращает объект, который реализует IEnumerable. В частности, он возвращает DataView если свойство DataSourceMode было установлено в DataSet, и объект DataReader если он установлен в DataReader. Следующие два примера показывают способ программного доступа к данным из SqlDataSource. Первый написан в VB и возвращает DataSet и затем проходит по записям, выводя результат. Второй пример написан в C# и использует SqlDataSource, который возвращает скалярную величину (средняя цена по всем продуктам) и выводит ее в элементе управления Label.

HTML Portion
<asp:Label ID="RandomProductNames" runat="server"></asp:Label>

<asp:SqlDataSource ID="rndProductsDataSource" runat="server"
   ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>"
   ProviderName="<%$ ConnectionStrings:NorthwindConnectionString.ProviderName %>"
   SelectCommand="SELECT [ProductID], [ProductName] FROM [Products]">
</asp:SqlDataSource>


Page_Load Event Handler
'Осуществляем программный доступ к SqlDataSource - возвращаем DataView
Dim dv As DataView = _
   CType(rndProductsDataSource.Select(DataSourceSelectArguments.Empty), DataView)

Dim rndCoinFlip As New Random
RandomProductNames.Text = String.Empty

For Each dr As DataRow In dv.Table.Rows
   'Проверяем если нам надо это отобразить
   If rndCoinFlip.Next(2) = 0 Then
      'Отображаем
      RandomProductNames.Text &= _
               dr("ProductName").ToString() & "<br />"
   Else
      'Don't show
   End If
Next
HTML Portion
The average price of all products in the Products database table is:
<asp:Label ID="AvgPrice" runat="server" ForeColor="Red"></asp:Label>

<asp:SqlDataSource ID="avgPriceDataSource" runat="server"
   ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>"
   ProviderName="<%$ ConnectionStrings:NorthwindConnectionString.ProviderName %>"
   SelectCommand="SELECT AVG(UnitPrice) FROM Products">
</asp:SqlDataSource>


Page_Load Event Handler
// Возвращаем результаты из SqlDataSource в качестве DataReader
OleDbDataReader reader = (OleDbDataReader)
      avgPriceDataSource.Select(DataSourceSelectArguments.Empty);

// Читаем значение
if (reader.Read())
   // Форматируем цену в денежные единицы
   AvgPrice.Text = string.Format("{0:c}", reader[0]);
else
   // Ой, не было получено ни одного результата!
   AvgPrice.Text = "I don't know!";

// Close the reader
reader.Close();

Заметьте, что в обоих примерах я преобразую возвращаемое методом Select() значение либо в DataView, либо в объект OleDbDataReader, в зависимости от свойства DataSourceMode. (Поскольку DataReaders являются объектами провайдеров, то если бы я использовал SqlClient провайдер, я бы также использовал SqlDataReader; в случае с провайдером OracleProvider, я бы использовал OracleDataReader, и т.д.)

При осуществлении запроса данных при помощи элемента SqlDataSource вы можете указать ту базу данных, к которой надо подключиться, и информацию, которую надо получить, посредством мастера "Configure Data Source" (Установка источника данных), который можно вызывать при помощи смарт-тега элемента SqlDataSource. Как только вы настроите источник данных (Data Source), информация может быть отображена путем связывания ее с элементом управления данными, либо обрабатывая ее программно вызовом метода Select() элемента SqlDataSource control. Полный код, используемый при программной работе с информацией элемента SqlDataSource, зависит от того, как она возвращается (что, в свою очередь, зависит от значения свойства DataSourceMode).