- <books>

  <book ISBN="5-8959-1091-9111" name_book="Microsoft 2.0 с примерами на C# 2005 для профессионалов" author="М. Мак-Дональд, М. Шпушта" price="500" pages="1408" year="2007" />

  <book ISBN="3-91180-009-3111" name_book="Гибкая разработка веб-приложений в среде Rails" author="Д. Томас, " price="400" pages="700" year="2008" />

. . .

</books>

Разумеется, автоматически переписать эту информацию в таблицу books гораздо удобнее, чем вручную заполнять формы для новых книг.

Создадим сценарий, который автоматически загружает данные из этого документа в таблицу books. Добавим на страницу источник данных SQLDataSource, единственная цель которого – выполнять команду INSERT:

INSERT INTO [books]

([ISBN], [name_book], [author], [price], [pages], [year])

VALUES (@ISBN, @name_book, @author, @price, @pages, @year)

Поместим на страницу элемент управления FileUpload из секции Standard, кнопку «Загрузить» и метку с именем Message.

Подключим необходимую библиотеку для работы с XML-классами:

using System. Xml;

Создадим обработчик для кнопки «Загрузить»:

protected void Button1_Click(object sender, EventArgs e)

{

Если файл был загружен:

if (this. FileUpload1.HasFile)

{

try

{

задаем путь к файлу на диске и сохраняем его.

string Name="c:\\upload\\" + FileUpload1.FileName;

FileUpload1.SaveAs(Name);

На экран будет выдано сообщение: имя и размер загруженного файла:

НЕ нашли? Не то? Что вы ищете?

Message. Text = "Имя файла: " +

FileUpload1.PostedFile. FileName + "<br>" +

FileUpload1.PostedFile. ContentLength + " кб<br>";

Создаем объект для последовательного чтения из XML-файла (модель SAX) и читаем его в цикле:

XmlTextReader XMLData = new XmlTextReader(Name);

while (XMLData. Read())

Если текущий элемент – узел <book>

if (XMLData. NodeType == XmlNodeType. Element)

if (XMLData. Name == "book")

{

читаем его атрибуты:

string ISBN = XMLData. GetAttribute("ISBN");

string name_book = XMLData. GetAttribute("name_book");

string author = XMLData. GetAttribute("author");

string pages = XMLData. GetAttribute("pages");

string price = XMLData. GetAttribute("price");

string year = XMLData. GetAttribute("year");

и записываем их в параметры запроса INSERT, затем выполняем запрос:

SqlDataSource1.InsertParameters["ISBN"].DefaultValue = ISBN;

SqlDataSource1.InsertParameters["name_book"].DefaultValue = name_book;

SqlDataSource1.InsertParameters["author"].DefaultValue = author;

SqlDataSource1.InsertParameters["pages"].DefaultValue = pages;

SqlDataSource1.InsertParameters["price"].DefaultValue = price;

SqlDataSource1.InsertParameters["year"].DefaultValue = year;

SqlDataSource1.Insert();

}

}

Предусмотрим вывод ошибки для тех случаев, когда возникает исключение:

catch (Exception ex)

{

Message. Text = "Ошибка: " + ex. Message. ToString();

}

}

}

Вообще говоря, в данном сценарии в базу загружается только информация о книгах, но не об экземплярах книг. Подумайте, как изменить XML-файл и сценарий загрузки, добавив информацию об экземплярах книг.

Выгрузка данных в XML-файл

Предположим, мы хотим выгрузить данные о читателе и его книгах в XML-файл следующего вида:

<?xml version="1.0" encoding="utf-8" ?>

- <formular>

  <reader id_reader="18" fio_reader="Петров Петр Петрович"

passport="1213 456789" addr_reader="Казань, Ленина, 20-2"

tel_reader="123-123-123" email_reader="*****@***ru"

datebird="11.11.1950 0:00:00" />

  <book ISBN="5-8959-1091-9" id_item="1"

date_get="21.11.2010 18:12:58" />

  <book ISBN="978-5-91180-009-3" id_item="6"

date_get="28.11.2010 18:26:08" />

. . .

</formular>

На странице личной карточки читателя создадим новую кнопку с надписью «Формуляр в формате XML» и зададим для нее обработчик:

protected void Button5_Click(object sender, EventArgs e)

{

Читаем данные из карточки читателя (объект DetailsView1):

string id_reader = DetailsView1.Rows[0].Cells[1].Text;

string fio_reader = DetailsView1.Rows[1].Cells[1].Text;

string passport = DetailsView1.Rows[2].Cells[1].Text;

string datebird = DetailsView1.Rows[3].Cells[1].Text;

string addr_reader =

DetailsView1.Rows[4].Cells[1].Text;

string tel_reader = DetailsView1.Rows[5].Cells[1].Text;

string email_reader =

DetailsView1.Rows[6].Cells[1].Text;

Создаем объект для записи XML-файла, имя файла – это номер читательского билета:

XmlTextWriter XMLData = new

XmlTextWriter("C:\\upload\\"+id_reader +

".xml", System. Text. Encoding. UTF8);

Записываем информацию о читателе:

XMLData. WriteStartDocument();

XMLData. WriteStartElement("formular");

XMLData. WriteStartElement("reader");

XMLData. WriteAttributeString("id_reader", id_reader);

XMLData. WriteAttributeString("fio_reader", fio_reader);

XMLData. WriteAttributeString("passport", passport);

XMLData. WriteAttributeString("addr_reader",

addr_reader);

XMLData. WriteAttributeString("tel_reader", tel_reader);

XMLData. WriteAttributeString("email_reader",

email_reader);

XMLData. WriteAttributeString("datebird", datebird);

XMLData. WriteEndElement();

Создаем выборку для книг на руках у читателя:

DataView GivenBooks = new DataView();

GivenBooks = (DataView)SqlDataSource3.Select(DataSourceSelectArguments. Empty);

Перебираем строки выборки и записываем информацию о книгах в XML-документ:

int i=0;

for (i=0; i < GivenBooks. Count; i++)

{

XMLData. WriteStartElement("book");

XMLData. WriteAttributeString("ISBN",

Convert. ToString(GivenBooks[i]["ISBN"]));

XMLData. WriteAttributeString("id_item",

Convert. ToString(GivenBooks[i]["id_item"]));

XMLData. WriteAttributeString("date_get",

Convert. ToString(GivenBooks[i]["date_get"]));

XMLData. WriteEndElement();

}

Закрываем тэги и файл:

XMLData. WriteEndElement();

XMLData. WriteEndDocument();

XMLData. Close();

}

Задание для самостоятельной работы. Этап 7.

Разработайте для вашего приложения сценарии загрузки и выгрузки данных в XML-формат.

Приложение 1. Вопросы и ответы

Вопрос. В SQL server 2005 при выполнении сценария, содержащего FormView, выдается ошибка: The version of SQL Server in use does not support datatype 'date'. Почему?

Если в таблице имеется тип данных DateTime, построитель FormView ошибочно указывает в параметрах запросов вместо него тип Date. Нужно вручную исправить в сценарии Date на DateTime.

Вопрос. Как в тексте C#-программы обратиться к элементу управления aspx-страницы?

Для этого удобно использовать метод FindControl. Например, в контейнере FormView1 (в любом его шаблоне) находится текстовое поле с именем ISBNTextBox. Получить из него значение можно следующим образом (не забывайте явно выполнить преобразование типа!):

((TextBox)FormView1.FindControl("ISBNTextBox")).Text

Вопрос. Что делать, если при подключении провайдера в Configuration выдается ошибка?

Следует:

1) запустить утилиту

C:\WINDOWS\\Framework\v2.0.50727\ aspnet_regsql. exe

2) на третьей странице мастера назначить точное имя сервера (например, HOME\SQLEXPRESS), после этого база данных будет создана автоматически;

3) затем в свойствах проекта в папке App_data выбрать пункт Add existing item, найти файл базы данных (примерный путь к нему C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\ ASPNETDB. MDF) и подключить его к проекту. Файл будет скопирован в папку App_data.

Вопрос. Что делать, если при запуске ASPX-страницы не удается подключиться к SQL серверу и выдается ошибка:

Generating user instances in SQL Server is disabled. Use sp_configure 'user instances enabled' to generate user instances.

Следует выполнить в среде SQL server management studio следующие команды:

sp_configure 'user instances enabled', 1

RECONFIGURE

Вопрос. Как из текущей страницы обратиться к элементу мастер-страницы?

Пусть, например, в мастер-странице есть метка для вывода сообщения. По умолчанию она скрыта (Visible="false").

<asp:Label ID="MessageBox" runat="server" Text="" Width="100%" Visible="false">

Из текущей страницы нам нужно иметь возможность изменить видимость этой метки, текст и цвет фона. Для этого в файле masterpage. master. cs зададим следующие свойства:

public string MessageBoxText

{

get { return MessageBox. Text; }

set { MessageBox. Text = value; }

}

public System. Drawing. Color MessageBoxColor

{

get { return MessageBox. BackColor; }

set { MessageBox. BackColor = value; }

}

public bool MessageBoxVisible

{

get { return MessageBox. Visible; }

set { MessageBox. Visible = value; }

}

Теперь при необходимости (например, в обработчике Page_Load текущей страницы) можно обращаться к этим свойствам:

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14