При выполнении в лабораторной работе упражнения №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
Упражнение 3. Выборка данных с помощью объекта DataTable
Объект System.Data.DataTable применяется для работы с одной таблицей из БД. Класс DataTable содержит три важных коллекции:
- Columns - содержит ноль и более объектов DataColumn, которые определяют имя, тип хранимых данных и первичный ключ каждого столбца из DataTable
- Rows - содержит ноль и более объектов DataRow, которые содержат реальные записи таблицы загруженных данных
- Constraints - содержит объекты типа ForeignKeyConstraint или UniqueConstraint. Первые определяют действия, выполняемые над ключевым столбцом при изменении или удалении строки, вторые используются для обеспечения уникальности всех значений в данном столбце
Объекты DataTable могут быть частью набора DataSet, но могут существовать и отдельно. Объект DataTable может заполняться адаптером данных точно также, как и объект DataSet - с помощью метода Fill() адаптера. Для адаптера данных не нужно специально открывать соединение с БД, оно устанавливается автоматически при работе метода Fill() и сразу закрывается после завершения работы метода. DataTable предназначен для работы в качестве автономного кэша табличных данных. Загруженные в DataTable данные можно динамически связывать с элементами отображения.
В данном упражнении мы соединимся с таблицей Customers БД и загрузим из нее в отображаемый список имена заказчиков CompanyName по начальному словосочетанию ключа CustomerID. При этом для отключенного хранения данных в приложении будем использовать объект DataTable.
- Добавьте к решению новый проект оконного приложения с именем WinForms3 и назначьте его стартовым
- Создайте в корне проекта папку Data и скопируйте в нее из предыдущего проекта файл Northwind.mdb (при этом отклоните предложение мастера конфигурации источника данных)
- Поместите на форму компоненты в соответствии с таблицей
Компонент | Свойство | Значение |
---|---|---|
Form | Text | Упражнение 3 |
MaximizeBox | False | |
Label | Text | Часть ID заказчика: |
TextBox | (Name) | txtCustomerID |
Text | пусто | |
ListBox | (Name) | lstCustomers |
Dock | Bottom |
- Модифицируйте файл Form1.cs проекта WinForms3 следующим образом
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.Collections; namespace WinForms3 { public partial class Form1 : Form { public Form1() { InitializeComponent(); LoadCustomers(); } // Строка соединения с абсолютным путем к БД, определяемым сборкой String ConnectionString(String fileName) { string JetEngineString = @"Provider=Microsoft.Jet.OLEDB.4.0;" + "Jet OLEDB:Engine Type=5;Data Source="; string pathToFile = Application.StartupPath.ToString() + "\\Data\\"; return JetEngineString + pathToFile + fileName.Trim() + ".mdb"; } OleDbDataAdapter adapter; // Создадим в методе LoadCustomers() DataTable table = new DataTable(); void LoadCustomers() { String strCommand = "SELECT CustomerID, CompanyName FROM Customers " + "WHERE CustomerID LIKE '" + txtCustomerID.Text.Trim() + "%'"; try { adapter = new OleDbDataAdapter(strCommand, ConnectionString("Northwind")); table.Clear();// Надо очистить, а то будет накопление !!! adapter.Fill(table); lstCustomers.Items.Clear();// Очищаем список foreach (DataRow row in table.Rows) { lstCustomers.Items.Add( row["CustomerID"] + "\t - " + row["CompanyName"]); } /* // Связываем прочитанные данные с элементом отображения //lstCustomers.Items.Clear(); // Нельзя очищать связанный список!!!!! lstCustomers.DataSource = table; lstCustomers.DisplayMember = "CompanyName"; lstCustomers.ValueMember = "CustomerID"; */ } catch (OleDbException exc) { MessageBox.Show(exc.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } }
При выборке данных могут возникнуть ошибки времени выполнения, поэтому мы этот код упаковали в блок обработки исключений. Например, при ошибке в шаблоне запроса будет выдано соответствующее сообщение, но приложение останется работоспособным
Предикат LIKE команды задает шаблон ' xx% ' проверки соответствия начальной фразы с любым последующим количеством символов поля CustomerID. Шаблон ' %xx% ' выбирает записи с установленной фразой в любом месте поля поиска. Если в шаблон с LIKE передается пустая строка, то будут выбраны все записи указанной таблицы.
- Создайте обработчик события KeyDown для текстового поля txtCustomerID с тем, чтобы список обновлялся по нажатию пользователем клавиши Enter при завершении ввода очередного значения параметра, и заполните его следующим кодом
private void txtCustomerID_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) LoadCustomers(); }
- Запустите приложение и поэкспериментируйте с его функциональностью, заложенной нами. Одно из представлений будет таким
Из кода видно, что объект DataTable является очень удобным средством работы с данными в отсоединенном режиме, как и вся инфраструктура ADO.NET в целом.