Спонсор: Microsoft
Опубликован: 14.11.2006 | Доступ: свободный | Студентов: 5844 / 513 | Оценка: 4.18 / 3.74 | Длительность: 16:37:00
ISBN: 978-5-9556-0085-7
Лекция 7:

Работа с базами данных (продолжение). Элементы-источники данных (Data Source Controls)

< Лекция 6 || Лекция 7: 1234 || Лекция 8 >

SqlDataSource

SqlDataSource объединяет в себе возможности SqlConnection и SqlDataAdapter (плюс дополнительные).

Итак, у нас есть строка подключения в файле web.config:

<add name="DemoBaseConnectionString1" connectionString="Data 
Source=(local)\SQLEXPRESS;Initial Catalog=DemoBase;Integrated 
Security=True"
providerName="System.Data.SqlClient" />

В свойство ConnectionString записывается эта строка:

<asp:SqlDataSource ID="SqlDataSource1" runat="server"
    ConnectionString="<%$ 
ConnectionStrings:DemoBaseConnectionString1 %>"
    ProviderName="<%$ 
ConnectionStrings:DemoBaseConnectionString1.ProviderName %>">
</asp:SqlDataSource>

В свойстве DataSourceMode SqlDataSource задается, посредством DataReader или DataSet получаются данные. При чтении посредством DataReader некоторые возможности не поддерживаются.

Получение данных связано со свойствами, похожими на свойства SqlDataAdapter: SelectCommand, SelectCommandType, DeleteCommand, DeleteCommandType и так далее. SelectCommandType может быть 2 типов — Text и StoredProcedure. Команды выполняются, когда вызываются соответствующие методы.

Метод Select вызывается с параметром типа DataSourceSelectArguments и возвращает DataSet или IDataReader в зависимости от значения свойства DataSourceMode, остальные же методы вызываются без параметров и возвращают количество обработанных строк:

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

Этот SqlDataSource читает все записи из таблицы Customers с помощью простого запроса в DataSet:

<asp:SqlDataSource ID="SqlDataSource3" runat="server" 
ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>"
    SelectCommand="[Ten Most Expensive Products]" 
SelectCommandType="StoredProcedure">
</asp:SqlDataSource>

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

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

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

Есть несколько классов параметров — наследников класса Parameter: CookieParameter использует значение ключа файла cookie, FormParameter — переменных формы, QuerystringParameter — адресной строки, ProfileParameter — профиля пользователя и SessionParameter — переменной сессии:

<asp:Parameter Name="UID" Type="Int32" DefaultValue="0" />

Такой тип параметров применяется, если SqlDataSource используется как источник данных для элементов с автоматическим связыванием — GridView, FormView, DetailsView. Значение параметра передается во "внутренностях" этих элементов.

В других случаях задействуется ControlParameter, то есть значение параметра берется из элемента управления. Также задается свойство, откуда и берется значение. Хотя если это Text, его можно не писать:

<asp:SqlDataSource ID="SqlDataSource3" runat="server" 
ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>"
    SelectCommand="Sales by Year" 
SelectCommandType="StoredProcedure">
    <SelectParameters>
    <asp:Parameter Name="Beginning_Date" Type="DateTime" 
DefaultValue="01.01.1998"/>
    <asp:ControlParameter Name="Ending_Date" Type="DateTime" 
ControlID="Calendar2"/>
    </SelectParameters>
</asp:SqlDataSource>

Источник параметра типа "Дата" — элемент управления "Календарь". При заданном свойстве параметра ConvertEmptyToNull текстовый параметр конвертируется в Null, если он пустой (равен System. String.Empty ).

Свойство CancelSelectOnNullParameter определяет, будет ли прерван запрос, если значение какого-либо параметра равно Null:

<asp:SqlDataSource ID="SqlDataSource4" runat="server" 
ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>"
    SelectCommand="SELECT * FROM [Customers] where @Country is 
null or Country = @Country"
 ProviderName="<%$ 
ConnectionStrings:NorthwindConnectionString.ProviderName %>" 
CancelSelectOnNullParameter="False">
    <SelectParameters> 
        <asp:QueryStringParameter Name="Country" 
QueryStringField="Country" /> 
    </SelectParameters>
</asp:SqlDataSource>

Этот запрос будет брать параметр из командной строки, например

http://localhost:3457/WebSite4/CustomersByCountry.aspx?Country=UK
< Лекция 6 || Лекция 7: 1234 || Лекция 8 >
Алексей Савельев
Алексей Савельев

https://technet.microsoft.com/en-us/library/ms143221(v=sql.105).aspx

Денис Прокофьев
Денис Прокофьев

Везде написано, что это самый независимый и простой в использовании навигационный элемент управления, что он работает сразу с web.sitemap и не требует определения SiteMapDataSource.

Моя карта сайта состоит из двух страниц, вложенных друг в друга. asp:Menu, asp:TreeView отбображаются как ожидалось, а вот asp:SiteMapPath - нет. Он не виден нигде. Однако на его месте формируется разметка: <span id="SiteMapPath1"><a href="#SiteMapPath1_SkipLink" style="position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden;">Проход по ссылкам навигации</a><a id="SiteMapPath1_SkipLink"></a></span> - т.е. элемент отрабатывает.

В словах xHTML это выглядит так: <asp:SiteMapPath ID="SiteMapPath1" runat="server" />. Причем не важно - внутри тега form или снаружи - всегда одинаково.

Т.к. другие нав. ЭУ работают через простой источник данных без ошибок, делаю вывод - карта составлена правильно. ИД: <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" />

Карта: <?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
  <siteMapNode url="~/L11_1_simplePage.aspx" title="Страница 1"  description="Простая страница 1." >
    <siteMapNode url="~/L11_1SimplePage2.aspx" title="Страница 2"  description="Простая страница 2" />
  </siteMapNode>
</siteMap>

Почему так происходит? Вроде делаю все по примерам. VS Community 2015. NetFramework в проекте: v4.0.30319