Опубликован: 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 >
Аннотация: Описание нового типа элементов управления группы Data.

Объектная модель источников данных

"Прежде всего нужны факты, а уж потом можно делать с ними, что хочешь". Марк Твен

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

В Visual Studio .NET 2002 и 2003 можно было создавать привязки данных к странице по технологии "drag-and-drop". Эта технология была удобна тем, что упрощала написание кода, но вместе с тем она усложняла его модификацию. Объекты данных DataAdapter и DataConnection напрямую связывались формой Visual Studio 2005. Сейчас это тоже возможно, но технология изменилась. Введена новая объектная модель источников данных. Классы-источники данных обеспечивают лучшую абстрактизацию, чем использование классов ADO.

Один из компонентов этой модели — строка соединения с источником данных. В Visual Studio 2005 все строки добавляются в конфигурационный файл web.config:

<configuration>
  <appSettings/>
  <connectionStrings>
  <add name="DemoBaseConnectionString1" 
connectionString="Data Source= \SQLEXPRESS;Initial 
Catalog=DemoBase;Integrated Security=True"
   providerName="System.Data.SqlClient" />
  <add name="DatabaseConnectionString1" connectionString="Data 
Source=.\SQLEXPRESS;AttachDbFilename="C:\Program 
Files\Microsoft Visual Studio 8\SDK\v2.0\QuickStart\aspnet\sam-
ples\data\App_Data\Database.mdf";Integrated 
Security=True;Connect Timeout=30;User Instance=True"
   providerName="System.Data.SqlClient" />
  </connectionStrings>

Разные страницы могут использовать одну и ту же строку соединения. Если по какой-либо причине соединение нужно будет изменить, например, если сервер изменил свое местоположение, изменения придется вводить централизованно в файле web.config.

Окно Data WebMatrix позволяет соединяться только с базами Access и SQL Server. Также работает перетаскивание, но требуется, чтобы в таблице имелся первичный ключ. Он не поддерживает и представлений ( View ) Access.

В WebMatrix существуют собственные элементы управления с префиксом wmx — AccessDataSourceControl и SqlDataSourceControl. Строка соединения записывается в свойство ConnectionString такого элемента управления. Программа WebMatrix служила испытательным полигоном для тех новых возможностей, которые позже были добавлены в Visual Studio .NET 2005:

<wmx:AccessDataSourceControl id="AccessDataSourceControl1" 
runat="server" ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0; 
Ole DB Services=-4; Data Source=D:\My_DOCs\guestbook.mdb" 
SelectCommand="SELECT * FROM 
[guestbook]"></wmx:AccessDataSourceControl>
    <wmx:SqlDataSourceControl id="SqlDataSourceControl1" 
runat="server" ConnectionString="server='SQLEXPRESS'; 
trusted_connection=true; database='Northwind'" 
SelectCommand="SELECT * FROM [Categories]" DeleteCommand="" 
UpdateCommand=""></wmx:SqlDataSourceControl>

Итак, строка соединения состоит из указания провайдера, если это Oledb, сервера и базы на этом сервере. База может находиться в отдельном файле с расширением .mdf. При соединении через ODBC указывается имя источника данных, тип базы, путь к файлу и драйвер:

<add name="ConnectionString1" 
connectionString="DSN=BB;DBQ=D:\Programming\Brain-
bench\brainbench.mdb;DriverId=25;FIL=MS 
Access;MaxBufferSize=2048;PageTimeout=5;" 
providerName="System.Data.Odbc" />

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

Строками соединений можно манипулировать и программно:

protected void Page_Load(object sender, EventArgs e)
  {
    if (!Page.IsPostBack)
    {
      // Создание класса ConnectionStringSettings
      ConnectionStringSettings conn = new ConnectionStringSettings();
      conn.ConnectionString = "Server=localhost; " +
      "User ID=sa;Password=m1d2ffnkl; " +
      "Database=Northwind;Persist Security Info=True";
      conn.Name = "Northwind ConnectionString";
      conn.ProviderName = "System.Data.SqlClient";
      //Добавление строки в файл web.config
      ConfigurationManager.ConnectionStrings.Add(conn);
    }
  }

Элементы-источники данных (Data Source Controls)

Эти элементы облегчают работу с ADO .NET, инкапсулируя работу с соединениями, командами и адаптерами. Они реализуют интерфейс IDataSource, в котором определен базовый набор возможностей работы с источниками данных. Большинство этих классов предоставляют функциональность для чтения и записи. Они являются обертками объектов ADO .NET. В предыдущих версиях надо было создавать объекты ADO самим и связывать элементы-управления с ними посредством команды DataBind. Например:

<asp:BulletedList ID="BulletedList1" runat="server" 
BulletStyle="Square" DataTextField="CategoryName" 
DataValueField="CategoryID">
</asp:BulletedList>

protected void Page_Load(object sender, EventArgs e)
{
    SqlConnection conn = new SqlConnection(@"Data 
Source=(local)\sqlexpress;Initial Catalog=Northwind;Integrated 
Security=True");
    SqlCommand cmd = new SqlCommand("SELECT CategoryID, 
CategoryName FROM Categories", conn);
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    DataSet ds = new DataSet();
    da.Fill(ds);
    BulletedList1.DataSource = ds;
    BulletedList1.DataBind();
}

Теперь элементы управления связываются c элементом-источником посредством свойства DataSourceID. Любой класс-источник данных может быть связан почти с любым классом для отображения данных, и это предоставляет большую гибкость.

Всего в ASP .NET 5 элементов-источников данных: SqlDataSource, AccessDataSource и ObjectDataSource для работы с табличными источниками данных и XmlDataSource и SiteMapDataSource — для работы с иерархическими данными.

SqlDataSource позволяет соединяться с большинством реляционных СУБД. Sql в названии класса означает, что служит для соединения с базами, которые понимают язык запросов Sql, а не только с MS SQL Server.

AccessDataSource оптимизирован для работы с базами Access. Например:

<asp:AccessDataSource ID="AccessDataSource1" runat="server" 
DataFile="~/App_Data/guestbook.mdb"
    SelectCommand="SELECT [WriteDate], [UserName], [UserMail], 
[Message] FROM [guestbook]">
</asp:AccessDataSource>

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

ObjectDataSource нужен для соединения с написанными программистом бизнес-объектами.

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

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