- <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 |


