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

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

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

После этого закройте QueryBuilder и нажмите на кнопку Advanced Options.


Рис. 7.1.

Как видите, мастер предлагает сгенерировать остальные команды самому. Прекрасно, мы не против. На следующем шаге мастер предложит изменить имена процедур и увидеть, что же он сгенерировал. Через остальные шаги можно пройти без изменений.

В результате получится файл Customers.xsd, по формату — файл схемы XML (XML Schema Definition), в котором описано и создание процедур, и команды для работы с базой вместе с параметрами, и еще один маленький файл Customers.xss. После этого проект желательно скомпилировать.

Мы получили компонент данных. Все готово для связывания его с ObjectDataSource. Перетащите значок нужного класса на форму и с помощью SmartTag запустите еще один мастер. На первом шаге настройте его на CustomersDataAdapters.CustomersDataAdapter. На втором надо выбрать подходящие функции для команд Select, Update, Delete, Insert. Вариантов будет немного — после выбора нажмите Finish. Можно привязывать наш ObjectDataSource к любому подходящему элементу управления, например, GridView:

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" 
SelectMethod="GetData" 
TypeName="CustomersTableAdapters.CustomersTableAdapter" 
DeleteMethod="Delete" InsertMethod="Insert" 
OldValuesParameterFormatString="original_{0}" 
UpdateMethod="Update">
    <DeleteParameters>
        <asp:Parameter Name="Original_CustomerID" Type="String" />
    </DeleteParameters>
    <UpdateParameters>
        <asp:Parameter Name="CustomerID" Type="String" />
        <asp:Parameter Name="CompanyName" Type="String" />
        <asp:Parameter Name="ContactName" Type="String" />
        <asp:Parameter Name="ContactTitle" Type="String" />
        <asp:Parameter Name="Country" Type="String" />
        <asp:Parameter Name="City" Type="String" />
        <asp:Parameter Name="Original_CustomerID" Type="String" />
    </UpdateParameters>
    <InsertParameters>
        <asp:Parameter Name="CustomerID" Type="String" />
        <asp:Parameter Name="CompanyName" Type="String" />
        <asp:Parameter Name="ContactName" Type="String" />
        <asp:Parameter Name="ContactTitle" Type="String" />
        <asp:Parameter Name="Country" Type="String" />
        <asp:Parameter Name="City" Type="String" />
    </InsertParameters>
</asp:ObjectDataSource>
    <asp:GridView ID="GridView1" runat="server" AllowPaging="True" 
AllowSorting="True"
    AutoGenerateColumns="False" DataKeyNames="CustomerID" 
DataSourceID="1">
    <Columns>
        <asp:CommandField ShowDeleteButton="True" 
ShowEditButton="True" ShowSelectButton="True" />
        <asp:BoundField DataField="CustomerID" 
HeaderText="CustomerID" ReadOnly="True" SortExpression="CustomerID" />
        <asp:BoundField DataField="CompanyName" 
HeaderText="CompanyName" SortExpression="CompanyName" />
        <asp:BoundField DataField="ContactName" 
HeaderText="ContactName" SortExpression="ContactName" />
        <asp:BoundField DataField="ContactTitle" 
HeaderText="ContactTitle" SortExpression="ContactTitle" />
        <asp:BoundField DataField="Country" HeaderText="Country" 
SortExpression="Country" />
        <asp:BoundField DataField="City" HeaderText="City" 
SortExpression="City" />
    </Columns>
</asp:GridView>

Класс бизнес-объекта создается неявно. Из файла .xsd можно получить класс типизированного набора данных на языке C# с помощью утилиты xsd.exe.

xsd.exe /dataset /language:CS Customers.xsd.

Из одного класса могут получать данные разные элементы Object DataSource. В приложении Personal Starter Kit определен класс Photo Manager, который работает с базой данных Personal.mdf:

public static Stream GetPhoto(int photoid, PhotoSize size)
  {
    using (SqlConnection connection = new 
SqlConnection(ConfigurationManager.ConnectionStrings["Personal"].C
onnectionString)) {
      using (SqlCommand command = new SqlCommand("GetPhoto", con-
nection)) {
        command.CommandType = CommandType.StoredProcedure;
        command.Parameters.Add(new SqlParameter("@PhotoID", 
photoid));
        command.Parameters.Add(new SqlParameter("@Size", 
(int)size));
        bool filter = 
!(HttpContext.Current.User.IsInRole("Friends") || 
HttpContext.Current.User.IsInRole("Administrators"));
        command.Parameters.Add(new SqlParameter("@IsPublic", 
filter));
        connection.Open();
        object result = command.ExecuteScalar();
        try {
          return new MemoryStream((byte[])result);
        } catch {
          return null;
        }
      }
    }

В этой функции полезно для усвоения получение двоичной информации, например изображений из базы данных.

Заключение

Мы рассмотрели классы-элементы управления, которые отвечают за получение данных. Эти классы предназначены в первую очередь для облегчения труда программиста (по сравнению с предыдущими версиями). Наиболее простые страницы с помощью этих элементов создаются даже без написания программного кода. В следующих двух лекциях подробнее займемся отображением данных. XMLDataSource будет рассмотрен в "Работа с XML" , а SiteMapSource — в "Навигация по сайту" .

< Лекция 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