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