Опубликован: 05.08.2010 | Уровень: специалист | Доступ: свободно
Самостоятельная работа 6:

Редактирование данных OLE DB средствами ADO.NET

Упражнение 5. Работа с объектом XmlDataDocument

Объект XmlDataDocument хранит в себе данные, загруженные из БД, сразу в двух форматах: обычный набор данных DataSet и Xml-формат данных. В некоторых случаях это может быть полезным. В этом упражнении проиллюстрируем некоторые возможности объекта XmlDataDocument.

  • Добавьте к приложению новый проект оконного приложения с именем WinForms5
  • Скопируйте из предыдущего проекта WinForms4 в корневой узел проекта WinForms5 папку Data вместе с файловой БД Northwind.mdb. На вопрос мастера конфигурации скажите Cancel
  • В панели Solution Explorer выделите файл БД Northwind.mdb и в панели Properties установите для него
    • Build Action=None
    • Copy to Output Directory=Copy if newer
  • Добавьте для корневого узла проекта WinForms5 командой Add/New Item заготовку файла конфигурации приложения с именем App.config


Иногда бывает удобно не прятать строку соединения в код приложения, а вынести ее в конфигурационный файл, чтобы при изменении условий выполнения не исправлять сам код. В этом упражнении мы и применим такой способ. При наличии множества БД можно заготовить несколько строк соединения в конфигурационном файле с разными именами, а в извлекать нужную строку по ее имени без изменения кода самого приложения.

  • Заполните конфигурационный файл кодом настройки строки соединения с БД, значение которой мы будем извлекать из кода приложения во время выполнения
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <connectionStrings>
        <add name="MyNorthwind"
            connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\Data\Northwind.mdb"
            providerName="System.Data.OleDb" />
    </connectionStrings>
</configuration>
  • Выделите корневой узел проекта WinForms5 и командой Project/Add Reference добавьте к проекту библиотечную сборку System.configuration.dll, в которой находится нужный нам класс ConfigurationManager для работы с конфигурационным файлом
  • Выделите корневой узел проекта WinForms5 и командой Project/WinForms5 Properties установите для вкладки Application список Output type в значение Console Application, чтобы иметь возможность просматривать информацию стандартного потока вывода
  • Заполните файл Form1.cs проекта WinForms5 следующим кодом
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
    
// Дополнительные пространства имен
using System.Data.OleDb;
using System.Data.Common;
using System.Xml;
using System.IO;
    
namespace WinForms5
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
    
            SetInterface();
            Load();
        }
    
        WebBrowser browser;
        DataGridView dataGridView;
        void SetInterface()
        {
            this.Text = "Упражнение 5";
            // Создаем сплиттер
            SplitContainer split = new SplitContainer();
            split.Orientation = Orientation.Horizontal;
            split.Dock = DockStyle.Fill;
            split.Parent = this;
    
            // Создаем элементы отображения
            dataGridView = new DataGridView();
            dataGridView.Dock = DockStyle.Fill;
            dataGridView.AutoSizeColumnsMode = 
                DataGridViewAutoSizeColumnsMode.Fill;
            dataGridView.RowHeadersWidth = 25;// Служебный столбец
            dataGridView.Parent = split.Panel1;
            browser = new WebBrowser();
            browser.Dock = DockStyle.Fill;
            browser.Parent = split.Panel2;
        }
    
        DataSet LoadDataSet()
        {
            // Извлекаем строку соединения из файла App.config
            String connectStr = System.Configuration.
                ConfigurationManager.ConnectionStrings["MyNorthwind"].ConnectionString;
    
            DataSet ds = new DataSet();
    
            // Заполняем множественный набор данных из БД
            using (OleDbConnection conn = new OleDbConnection(connectStr))
            {
                OleDbCommand selectCommand = conn.CreateCommand();// Команда получила соединение
                OleDbDataAdapter adapter = new OleDbDataAdapter(selectCommand);
    
                // Загружает данные и схему первой таблицы
                selectCommand.CommandText = "SELECT EmployeeID, " +
                    "(LastName + ', ' + FirstName) AS FullName, " + 
                    "Address, BirthDate, Region FROM Employees";
                adapter.Fill(ds);
            }
    
            return ds;
        }
    
        XmlDataDocument document;
        String path;
        new void Load()
        {
            // Определяем полный путь к хранилищу данных
            path = Application.StartupPath.ToString() + @"\Data\";
            // Создаем Xml-документ и загружаем его данными
            document = new XmlDataDocument(LoadDataSet());
            // Связываем с сеткой для отображения
            dataGridView.DataSource = document.DataSet;// Только для чтения
            dataGridView.DataMember = "Table";// Дежурное имя, когда не задано явно
    
            // Все тонкие ссылки можно объявить типом 
            // ближайшего абстрактного предка (просто так!)
            TextWriter tw = new StringWriter();// Создали поток записи
            document.Save(tw); ;// Сохраняем документ в потоке 
            document.Save(path + "XmlDataDocument.xml");// Сохранили в файле
    
            // Выводим в консольное окно
            TextReader tr = new StringReader(tw.ToString());// Создали поток чтения
            String str = tr.ToString();// Если ничего нет, то будет null
            while (str != null)
            {
                str = tr.ReadLine();
                Console.WriteLine(str);
            }
    
            browser.Navigate(path + "XmlDataDocument.xml");
    
            // Регистрируем обработчик события редактирования строки
            document.DataSet.Tables[0].RowChanged += 
                new DataRowChangeEventHandler(Form1_RowChanged);
        }
    
        void Form1_RowChanged(object sender, DataRowChangeEventArgs e)
        {
            document.Save(path + "XmlDataDocument.xml");
            browser.Navigate(path + "XmlDataDocument.xml");
        }
    }
}
  • Разберитесь с кодом упражнения, запустите проект и удостоверьтесь, что редактирование строк в формате DataSet немедленно отражается и в Xml-представлении с помощью объекта XmlDataDocument. Хотя здесь мы и не сохраняем изменения в самой БД


Алексей Бабушкин
Алексей Бабушкин

При выполнении в лабораторной работе упражнения №1 , а именно при выполнении нижеследующего кода:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using Microsoft.Xna.Framework.Graphics;

   

namespace Application1

{

    public partial class MainForm : Form

    {

        // Объявим поле графического устройства для видимости в методах

        GraphicsDevice device;

   

        public MainForm()

        {

            InitializeComponent();

   

            // Подпишемся на событие Load формы

            this.Load += new EventHandler(MainForm_Load);

   

            // Попишемся на событие FormClosed формы

            this.FormClosed += new FormClosedEventHandler(MainForm_FormClosed);

        }

   

        void MainForm_FormClosed(object sender, FormClosedEventArgs e)

        {

            //  Удаляем (освобождаем) устройство

            device.Dispose();

            // На всякий случай присваиваем ссылке на устройство значение null

            device = null;       

        }

   

        void MainForm_Load(object sender, EventArgs e)

        {

            // Создаем объект представления для настройки графического устройства

            PresentationParameters presentParams = new PresentationParameters();

            // Настраиваем объект представления через его свойства

            presentParams.IsFullScreen = false; // Включаем оконный режим

            presentParams.BackBufferCount = 1;  // Включаем задний буфер

                                                // для двойной буферизации

            // Переключение переднего и заднего буферов

            // должно осуществляться с максимальной эффективностью

            presentParams.SwapEffect = SwapEffect.Discard;

            // Устанавливаем размеры заднего буфера по клиентской области окна формы

            presentParams.BackBufferWidth = this.ClientSize.Width;

            presentParams.BackBufferHeight = this.ClientSize.Height;

   

            // Создадим графическое устройство с заданными настройками

            device = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, DeviceType.Hardware,

                this.Handle, presentParams);

        }

   

        protected override void OnPaint(PaintEventArgs e)

        {

            device.Clear(Microsoft.Xna.Framework.Graphics.Color.CornflowerBlue);

   

            base.OnPaint(e);

        }

    }

}

Выбрасывается исключение:

Невозможно загрузить файл или сборку "Microsoft.Xna.Framework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=6d5c3888ef60e27d" или один из зависимых от них компонентов. Не удается найти указанный файл.

Делаю все пунктуально. В чем может быть проблема?

Юрий Макушин
Юрий Макушин
Россия, Москва, РЭА им. Плеханова, 2004