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

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

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

Вот код упражнения

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;
    
namespace WinForms4
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.Text = "Упражнение 4";
            this.Size = new Size(350, 300);
            
            CreatePage1();
            CreatePage2();
            CreatePage3();
            CreatePage4();
            CreatePage5();
            CreatePage6();
    
            // Регистрируем обработчик для удаления файлов при закрытии
            //this.FormClosed += new FormClosedEventHandler(Form1_FormClosed);
        }
    
        void DeleteFile(String name)
        {
            // Определяем полный путь к хранилищу данных
            String path = Application.StartupPath.ToString() + @"\Data\";
    
            if (System.IO.File.Exists(path + name))
                System.IO.File.Delete(path + name);
        }
    
        void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            // Удаляем файлы, если существуют (для примера)
            DeleteFile("ds.xml");
            DeleteFile("dsItSchema.xml");
            DeleteFile("Employees.xml");
            DeleteFile("Products.xml");
        }
    
        ~Form1()
        {
            /* 
             * Можно и в деструктор засунуть удаление файлов
             * Но это произойдет не немедленно, а когда 
             * сборщик мусора доберется до брошенного объекта приложения
             * Либо самим вызвать сборщик мусора, вставив в файл Program.cs
             * после цикла сообщений код System.GC.Collect();
             * Попробуйте!!!
             //*/
        }
    
        // Строка соединения к БД с абсолютным путем, определяемым сборкой
        String ConnectionString()
        {
            // Используем построитель строки подключения 
            OleDbConnectionStringBuilder objConnectionStringBuilder =
                new OleDbConnectionStringBuilder();
            objConnectionStringBuilder.Provider = "Microsoft.Jet.OLEDB.4.0";
            objConnectionStringBuilder.DataSource =
                Application.StartupPath.ToString() + @"\Data\Northwind.mdb";
            // Текущий путь
            //System.Environment.CurrentDirectory.ToString()
            // Путь к сборке + имя сборки с расширением .exe
            //Application.ExecutablePath + @"\Data\Northwind.mdb";
    
            return objConnectionStringBuilder.ToString();
        }
    
        DataSet LoadDataSet()
        {
            DataSet ds= new DataSet();
            
            // Заполняем множественный набор данных из БД
            using (OleDbConnection conn = new OleDbConnection(ConnectionString()))
            {
                OleDbCommand selectCommand = conn.CreateCommand();// Команда получила соединение
                OleDbDataAdapter adapter = new OleDbDataAdapter(selectCommand);
                //adapter.FillSchema(ds, SchemaType.Source);// Лишнее, загружается вместе с данными
    
                selectCommand.CommandText = "SELECT * FROM Employees";
                // Загружает данные и схему (по умолчанию) первой таблицы
                // Без маркера может добавиться только одна
                // таблица и будет иметь дежурное имя Table
                adapter.Fill(ds, "Empl");
    
                // Загружает данные и схему второй таблицы
                selectCommand.CommandText = "SELECT * FROM Products";
                adapter.Fill(ds, "Prod");
                // Чтобы повторно не добавлялось одно и то же 
                adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
                adapter.Fill(ds, "Prod");// Не добавится, т.к. установили AddWithKey
    
                //adapter.FillSchema(ds, SchemaType.Source);// Загрузить только схему
            }
    
            return ds;
        }
    
        TabControl tabControl;
        void CreatePage1()
        {
            // Контейнер вкладок создаем здесь
            tabControl = new TabControl();
            tabControl.Parent = this;
            tabControl.Dock = DockStyle.Fill;
            tabControl.Multiline = true;// Если ярлыки вкладок на помещаются
            tabControl.ShowToolTips = true;// Разрешить всплывающие посказки
            tabControl.SelectedIndex = 5;// Устанавливает начальную вкладку (просто так!)
    
            // Вкладка Page1
            TabPage tabPage = new TabPage("Данные из БД");
            tabPage.Parent = tabControl;
            tabPage.ToolTipText = "Множественный набор,\nполученный из БД";
            SplitContainer split = new SplitContainer();
            split.Orientation = Orientation.Horizontal;
            split.Dock = DockStyle.Fill;
            split.Parent = tabPage;
            DataGridView dataGridView1 = new DataGridView();
            dataGridView1.Dock = DockStyle.Fill;
            // Сетки помещаем в панели сплиттера
            dataGridView1.Parent = split.Panel1;
            DataGridView dataGridView2 = new DataGridView();
            dataGridView2.Dock = DockStyle.Fill;
            dataGridView2.Parent = split.Panel2;
    
            // Заполняем множественный набор данными из БД
            DataSet ds = LoadDataSet();
    
            // Связываем с сетками
            // Первый способ
            dataGridView1.DataSource = ds.Tables["Empl"];// Как таблицу 
            // Второй способ
            dataGridView2.DataSource = ds;// Как множественный набор
            dataGridView2.DataMember = "Prod";// Уточняем из набора
        }
    
        void CreatePage2()
        {
            // Вкладка Page2
            TabPage tabPage = new TabPage("Данные из Xml");
            tabPage.Parent = tabControl;
            tabPage.ToolTipText = "Множественный набор,\nполученный из Xml";
            SplitContainer split = new SplitContainer();
            split.Orientation = Orientation.Horizontal;
            split.Dock = DockStyle.Fill;
            split.Parent = tabPage;
            DataGridView dataGridView1 = new DataGridView();
            dataGridView1.Dock = DockStyle.Fill;
            dataGridView1.Parent = split.Panel1;
            DataGridView dataGridView2 = new DataGridView();
            dataGridView2.Dock = DockStyle.Fill;
            dataGridView2.Parent = split.Panel2;
    
            // Заполняем множественный набор данными из БД
            DataSet ds = LoadDataSet();
    
            // 
            // Сохраняем загруженные данные из набора в Xml-файл (Без схемы!!!)
            //
            // Определяем полный путь к хранилищу данных
            String path = Application.StartupPath.ToString() + @"\Data\";
            // Множественный набор в Xml-файле не обязательно сохранять вместе 
            // со схемой, метод DataSet.ReadXml() потом итак будет читать
            // Но Xml-файл будет без схемы
            //ds.WriteXml(path + "ds.xml", XmlWriteMode.WriteSchema);
            ds.WriteXml(path + "ds.xml");
    
            // Извлекаем данные из Xml-файла набора и показываем
            ds = null;// Бросаем старый объект
            ds = new DataSet();// Создаем новый объект
            ds.ReadXml(path + "ds.xml");// Загружаем из Xml-файла
            // Привязываем наборы данных к сеткам для отображения
            // Первый способ
            dataGridView1.DataSource = ds.Tables["Empl"];// Как таблицу 
            // Второй способ
            dataGridView2.DataSource = ds;// Как множественный набор
            dataGridView2.DataMember = "Prod";// Уточняем из набора
    
            // Удаляем файл (для примера)
            System.IO.File.Delete(path + "ds.xml");
        }
    
        void CreatePage3()
        {
            // Вкладка Page3
            TabPage tabPage = new TabPage("Xml без схемы");
            tabPage.Parent = tabControl;
            tabPage.ToolTipText = "Представление набора\nв Xml без схемы";
            WebBrowser browser = new WebBrowser();
            browser.Dock = DockStyle.Fill;
            browser.Parent = tabPage;
    
            // Заполняем множественный набор данными из БД
            DataSet ds = LoadDataSet();
    
            // Сохраняем загруженные данные из набора в Xml-файл (Без схемы!!!)
            String path = Application.StartupPath.ToString() + @"\Data\";
            ds.WriteXml(path + "ds.xml");
    
            // Извлекаем данные из Xml-файла набора и показываем
            browser.Navigate(path + "ds.xml");// Связываемся с Xml-файлом
    
            // Удалять файл нельзя, открыт навигатором в потоковом режиме
            //System.IO.File.Delete(path + "ds.xml");
        }
    
        void CreatePage4()
        {
            // Вкладка Page4
            TabPage tabPage = new TabPage("Xml со схемой");
            tabPage.Parent = tabControl;
            tabPage.ToolTipText = "Представление набора\nв Xml со схемой";
            WebBrowser browser = new WebBrowser();
            browser.Dock = DockStyle.Fill;
            browser.Parent = tabPage;
    
            // Заполняем множественный набор данными из БД
            DataSet ds = LoadDataSet();
    
            // Сохраняем загруженные данные из набора в Xml-файл (и схема!!!)
            String path = Application.StartupPath.ToString() + @"\Data\";
            ds.WriteXml(path + "dsItSchema.xml", XmlWriteMode.WriteSchema);
    
            // Извлекаем данные из Xml-файла набора и показываем
            browser.Navigate(path + "dsItSchema.xml");// Связываемся с Xml-файлом
        }
    
        void CreatePage5()
        {
            // Вкладка Page5
            TabPage tabPage = new TabPage("Таблица в Xml");
            tabPage.Parent = tabControl;
            tabPage.ToolTipText = "Таблица в Xml-представлении\n"
                + "с включенной схемой\n(иначе не прочесть)";
            WebBrowser browser = new WebBrowser();
            browser.Dock = DockStyle.Fill;
            browser.Parent = tabPage;
    
            String path = Application.StartupPath.ToString() + @"\Data\";
    
            // Читаем Xml-файл множественного набора
            // Он сохранен предыдущей вкладкой
            DataSet ds = new DataSet();
            ds.ReadXml(path + "dsItSchema.xml", XmlReadMode.ReadSchema);
    
            // Создаем новый объект для таблицы Employees
            DataTable table = new DataTable();
            table = ds.Tables["Empl"].Copy();// Теперь самостоятельная таблица
            // Сохраним для следующей вкладки в Xml-файле
            table.WriteXml(path + "Employees.xml", XmlWriteMode.WriteSchema);
    
            // Теряем набор сборщику мусора (... для осознанья и просветления!!!)
            ds = null;
            GC.Collect();// Запустить уборку
            GC.WaitForPendingFinalizers();// Ждать конца уборки
    
            // Показываем Xml пользователю
            browser.Navigate(path + "Employees.xml");
        }
    
        void CreatePage6()
        {
            // Вкладка Page6
            TabPage tabPage = new TabPage("Таблица из Xml");
            tabPage.Parent = tabControl;
            tabPage.ToolTipText = "Таблица данных,\nполученных из файла Xml";
            DataGridView dataGridView = new DataGridView();
            dataGridView.Dock = DockStyle.Fill;
            dataGridView.Parent = tabPage;
    
            String path = Application.StartupPath.ToString() + @"\Data\";
    
            // Читаем Xml-файл для таблицы Employees
            DataTable table = new DataTable();
            table.ReadXml(path + "Employees.xml");
    
            // Показываем пользователю
            dataGridView.DataSource = table;
        }
    }
}
  • Разберитесь с кодом, создайте проект WinForms4 и поэкспериментируйте с ним

Вот пара снимков



Мы видим, что данные полность восстанавливаются из Xml и могут безбоязненно быть отправлены в БД. Очень удобно брать работу на дом, если сделать небольшое приложение, которое перед уходом скопирует секретные данные в Xml-файл. Всю базу копировать долго и нести тяжело, а пару файлов Xml можно дома опять преобразовать в БД и спокойно работать (особенно шпиенам). Да и переслать по сети будет легче.

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

При выполнении в лабораторной работе упражнения №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" или один из зависимых от них компонентов. Не удается найти указанный файл.

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

Dmitriy Ivanchenko
Dmitriy Ivanchenko
Украина, Кировоград, Виктория-П, 2011
Татьяна Ковалюк
Татьяна Ковалюк
Украина, Киев, Киевский политехнический институт, 1974