|
При выполнении в лабораторной работе упражнения №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" или один из зависимых от них компонентов. Не удается найти указанный файл. Делаю все пунктуально. В чем может быть проблема? |
Редактирование данных 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 можно дома опять преобразовать в БД и спокойно работать (особенно шпиенам). Да и переслать по сети будет легче.

