Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Технология .NET. ASP.NET, ADO.NET. Язык C#.


Информационный Канал Subscribe.Ru


 Технология .NET: ASP.NET, ADO.NET, C#

Тематическая рассылка сайта http://www.daoto.net/

Выпуск 2-ой.

Доброго дня, уважаемые читатели!

Перед вами второй выпуск рассылки сайта Путь к .NET, посвященной, ясное дело, технологии .NET.

Что будет в рассылке

Свои мысли, замечания и идеи по поводу рассылки вы можете присылать на мой ящик: daoto@daoto.net.

Мысли вслух

1. Использование шаблонов в серверном элементе управления DataGrid для отображения данных (ASP.NET).

Для отображения табличных данных на Web-странице достаточно поместить на эту страницу DataGrid и в обработчике Page_Load прописать примерно следующее:

SqlConnection conn = new SqlConnection(ConfigurationSettings.AppSettings["ConnectionString"]); SqlCommand
comm = new SqlCommand("SELECT * FROM myTable", conn);
conn.Open();
dataGrid.DataSource = comm.ExecuteReader();
if(!this.IsPostBack)
 this.DataBind();
conn.Close();

Однако в большинстве случаев такого представление данных будет недостаточно. Рассмотрим такой пример у нас есть таблица хранящая список авторов:

CREATE TABLE
(
 id_author varchar(20) PRIMARY KEY,
 name varchar(50),
 surname varchar(50),
 fatherName varchar(50),
 email varchar(50),
 page varchar(50),
 icq int,
 description varchar(500)
)

При ее отображение вся информация об авторе будет размещена в одну строку. Такие данные как адрес сайта (page) и e-mail (email) размещаются в одну строку т.к по сути они представляют из себя одно слово, зато поле описание (description) - прекрасно переносится, поэтому адрес сайта и почта займут себе необходимое пространство, а длинное поле описание будет довольствоваться оставшимся клочком страницы. Не знаю, что вы думаете по этому поводу - для меня это совершенно недопустимо. Скажем нам необходимо, чтобы в первой строке отображался ник автора, представляющий из себя гиперссылку на его почту, затем адрес сайта - также гиперссылка, затем номер ICQ (и никаких гиперссылок - не переношу ICQ  в виде гиперссылок, лучше просто номер - так удобней). На второй строке - Фамилия Имя Отчество, выделенное жирным. И начиная с третьей строки распологалось описание, выделенное курсивом. Вот тут-то и пригодятся шаблоны.

Так уж сложилось, что использование шаблонов в Repeater и DataList детально описано, а вот DataGrid обойден вниманием. Мало того, даже в одной из "главных" книг по ASP.NET (это первая книга по ASP.NET, вышедшая в России и, возможно, в мире) Дуглас Дж. Рейли "Создание приложений ASP.NET" пишется:

"<...> некоторые недостатки затрудняют его [DataGrid] использование <...>. Во-первых (и это самое важное), обратите внимание на разницу в общей ширине табличных форм [вот об этом-то я и писал выше, когда обсуждал вывод данных без использования шаблонов] [стр. 348]<...>
<...> но он [Repeater] обеспечивает больше средств детальной настройки столбцов [чем DataGrid, в данном случае имеется в виду использование шаблонов в Repeater] <...> можно вообще отказаться от табличного представления [для Repeater] [стр. 350]<...>"

Скажем, в DataGrid также можно "детально настраивать столбцы" и мало того "вообще отказаться от табличного представления". В нашем примере, для отображения списка авторов никакой таблицей c ее колонками и не пахнет (хотя можно сказать, что у нас таблица с одной колонкой, но так можно про любой текст сказать). Для того, чтобы управлять режимом представления DataGrid'а, сначала надо отключить автоматическую генерацию колонок DataGrid'а (эта способность использовалась в первом примере, но сейчас она нам только помешает). Для этого надо присвоить свойству AutoGenerateColumns значение "false".

Для определения колонки, в которой будут использоваться шаблоны, используется серверный элемент управления

<asp:TemplateColumn></asp:TemplateColumn>

В противоположность ему существует:

<asp:BoundColumn DataField= "id_author"></asp:BoundColumn>

в свойстве DataField которого задается имя отображаемого поля. В данном случае будет отображаться id_author. Он используется для представления одного столбца таблицы.

Для определения шаблона отображаемых данных используется атрибут ItemTemplate. А вот пример ASP.NET - кода, отображающий необходимым нам способом список авторов:

<asp:DataGrid id="dataGrid" runat="server" AutoGenerateColumns="False">
<Columns>
 <asp:TemplateColumn HeaderText="Авторы">
  <ItemTemplate>
   <a href='mailto:<%# DataBinder.Eval(Container.DataItem, "email")%>'>
    <%# DataBinder.Eval(Container.DataItem, "id_author")%></a>
      <a href='<%# DataBinder.Eval(Container.DataItem, "page")%>'>
    http://<%# DataBinder.Eval(Container.DataItem, "page")%></a>
   <%# String.Format("ICQ: {0}",
    DataBinder.Eval(Container.DataItem, "icq"))%>
   <br>
   <b>
    <%# DataBinder.Eval(Container.DataItem, "name")%>
    <%# DataBinder.Eval(Container.DataItem, "fatherName")%>
    <%# DataBinder.Eval(Container.DataItem, "surname")%>
   </b>
   <br>
   <i>
    <%# DataBinder.Eval(Container.DataItem, "description")%>
   </i>
  </ItemTemplate>
 </asp:TemplateColumn>
</Columns>
</asp:DataGrid>

Код в обработчике Page_Load не меняется.

Обратите внимание на статический метод Eval, существует его пререгруженный вариант, принимающий в качестве третьего параметра строку форматирования - аналогичную строке форматирования String.Format. Например, вместо

String.Format("ICQ: {0}",DataBinder.Eval(Container.DataItem, "icq"))

можно было написать:

DataBinder.Eval(Container.DataItem, "icq", "ICQ: {0}")

Кроме ItemTemplate есть еще атрибут EditItemTemplate, позволяющий задавать отображение данных в режиме редактирования. Ну об этом, пожалуй в следующий раз.

2. Выполнение запросов DataAdapter в контексте транзакции (ADO.NET).

Выполнить обычный запрос с помощью объекта SqlCommand в контексте транзакции не составляет особых затруднений:

SqlConnection conn = new SqlConnection(connString);
SqlCommand comm = new SqlCommand("TRUNCATE TABLE Authors", conn);
SqlTransaction tran = null;
try
{
 conn.Open();
 tran = conn.BeginTransaction();
 comm.Transaction = tran;
 comm.ExecuteNonQuery();
 tran.Commit();
}
catch(Exception ex)
{
 tran.Rollback();
 lbMessage.Text = ex.Message;
}
finally
{
 conn.Close();
}

Но существует небольшая тонкость в случае, если мы будем пытаться выполнить запросы DataAdapter, автоматически созданные с помощью CommandBuilder, в контексте транзакции. Следующий код сгенерирует исключение времени выполнения:

dataAdapter.InsertCommand.Transaction = tran;

Еще раз повторяю - это касается только команд, автоматически сгенерированных с помощью CommandBuilder. Если вы сами определили InsertCommand объекта dataAdapter исключения не возникнет.

Следующий пример показывает как выполнить автоматически сгенерированные команды обновления DataAdapter в контексте транзакции

SqlConnection conn = new SqlConnection(connString);
SqlDataAdapter dataAdapter = new SqlDataAdapter("SELECT * FROM Authors", conn);
SqlCommandBuilder builder = new SqlCommandBuilder(dataAdapter);
SqlTransactiontran = null;
DataSet dataSet = new dataSet();
//.
try
{
 conn.Open();
 builder.GetInsertCommand();
 tran = conn.BeginTransaction();
 builder.GetInsertCommand().Transation = tran;
 builder.GetDeleteCommand().Transation = tran;
 builder.GetUpdateCommand().Transation = tran;
 
 dataAdapter.Update(dataSet);
 tran.Commit();
}
catch(Exception ex)
{
 tran.Rollback();
 lb.Message.Text = ex.Message;
}
finally
{
 conn.Close();
}

Ключевой момент в вызове builder.GetInsertCommand() перед началом транзакции, что позволяет builder сгенерировать логику обновления.

3. Хранение строк подключения в приложениях ASP.NET.

Самое удобное - это хранить строку подключения в файле конфигурации Web-приложения Web.config. Таким образом мы не прошиваем жестко в код приложения строку подключения, что позволяет нам ее легко менять, скажем при изменении пароля или даже базы данных (это случается при переносе приложения на Web-сервер). На данный момент в коде движка сайта http://www.daoto.net/ строка подключения используется около 15 раз, только за апрель я уже 6 раз вносил изменения в движок сайта, сколько раз мне бы пришлось менять строку подключения, если бы я ее жестко прошил в коде? А так я о ней даже не думаю - на локальном компьютере, где я пишу и тестирую сайт, и на сервере используются разные файлы конфигурации Web.config. Кроме того, хранение строки подключения гарантирует, что во всех запросах приложения будет идентичная строка подключения (или идентичные, если по каким-либо причинам вам необходимо использовать несколько строк подключения) - это позволяет воспользоваться преимушествами пула соединений. Если вы беспокоитесь о безопасности, то могу вас успокоить, что IIS запрещает доступ к файлам с расширением *.config. Попробуйте узнать мою строку подключения: http://www.daoto.net/web.config ;-). В крайнем случае вместо пароля можно хранить его хеш-код.

Итак, чтобы сохранить чтроку подключения в файле Web.config, необходимо прописать следующее:

<configuration> 
<!--...-->
  <appSettings>
    <add key="ConnectionString" value="user id=sa;data source=(local);
      persist security info=True;initial catalog=H_sash;password=passwd" />
  </appSettings>
</configuration>

А вот пример использования строки подключения в нашем приложении:

//.
using System.Configuration;
//.
SqlConnection conn = 
 new sqlConnection(ConfigurationSettings.AppSettings["ConnectionString"]);

Последние статьи

XML. Создание приложения, работающего с XML - данными - I

Окончание статьи Создание приложения, работающего с XML-данными. Рассмотрено редактирование, удаление и добавления таблиц (или элементов в терминах информационного множества XML Infoset).

ADO.NET. Работа с данными в ADO.NET - II

В этой статье рассмотрены классы пространства имен System.Data - DataColumn, DataRow, DataTable, DataSet - предназначенные для работы с отсоеденными данными. В первой части статьи мы рассмотрим создание таблиц DataTable и класс DataColumn.

Web-сервисы. Поддержка, обеспечиваемая в расширениях Web-сервисов 2.0 для спецификации

В этой статье описывается поддержка для WS-Policy в Предварительном представлении технологии WSE 2.0, приведены доступные возможности политики и показаны примеры их использования.

Новости партнеров. Встреча Ukrine .NET Alliance

14 мая в 18:00 в городе Харькове состоиться очередная встреча UNETA.

Новости партнеров. Бесплатный хостинг интересным ресурсам.

Parking.ru объявляет об открытии партнерской программы, предусматривающей предоставление бесплатного хостинга для интересных тематических ресурсов, функционирующих на платформе Windows?

Поэзия. Гарики

Избранные "гарики" Игоря Губермана. Правда избраны они не мной - я их по аське получил. Но все равно интересно.

Архив рассылки. Выпуск 1-й.

Первый выпуск тематической рассылки сайта.

Новости сайта

Итак, у нас появилось четыре новых раздела - Архив рассылки и Поэзия. Последний раздел создан из-за "гариков" :-). Два следующих раздела .NET''овские: XML Web-сервисы и XML


PARKING.RU
Качественный ВИРТУАЛЬНЫЙ ХОСТИНГ на платформе Windows(r): поддержка .NET, многофункциональная панель управления, аренда бизнес-приложений, сертифицированные специалисты.
http://www.parking.ru/hosting.asp


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу


В избранное