При выполнении в лабораторной работе упражнения №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
Упражнение 5. Выборка строк DataTable с помощью метода Select()
Выборку строк по определенному критерию традиционно можно выполнить с помощью SQL-запроса. Например, можно запросить всех заказчиков из таблицы Customers, имена которых начинаются на " My ". с помощью такой команды
SELECT * FROM Customers WHERE FirstName LIKE 'My%
Или запросить всех заказчиков, имена которых заканчиваются на " jon "
SELECT * FROM Customers WHERE FirstName LIKE '%jon'
Если нужно выполнять много подобных запросов к одной и той же таблице с помощью SQL, то для этого потребуется часто соединяться с БД, которая может быть занята запросами других пользователей. Хорошо бы было загрузить в кэш полную таблицу и обращаться к ней с запросами сколько угодно раз, не обращаясь к самой центральной БД. Для таких целей предусмотрен метод Select() объекта DataTable, который возвращает коллекцию строк, удовлетворяющих условию выборки. В методе можно также задавать и условие сортировки результирующего набора данных.
В данном упражнении поставим следующую задачу. В раскрывающийся список считаем из БД всех служащих из таблицы Employees. Загрузим в кэш полную таблицу заказов Orders и дадим возможность пользователю просматривать из этой таблицы те заказы, которые оформил конкретный служащий, выбранный в раскрывающемся списке.
- Добавьте к решению новый проект оконного приложения с именем WinForms5 и назначьте его стартовым
- В панели Solution Explorer в корневой узел проекта WinForms5 перетащите мышью из соседнего проекта папку Data с файлом Northwind.mdb (при этом отклоните предложение мастера конфигурации источника данных)
- Добавьте в начало файла Form1.cs подключения пространства имен сборки System.Data.dll, нужные для обеспечения видимости библиотечных классов
// Дополнительные пространства имен using System.Data.OleDb; using System.Data.Common; using System.Collections;
- Оформите пользовательский интерфейс формы в соответствии с таблицей
Объект | Свойство | Значение | Пояснения |
---|---|---|---|
Form1 | Text | Упражнение 5 | Заголовок окна |
MaximizeBox | False | Отключили системную кнопку | |
FormBorderStyle | FixedSingle | Размеры окна менять нельзя | |
Label | Text | Employee: | |
ComboBox | (Name) | cbEmployees | |
DropDownStyle | DropDownList | Текст в поле списка редактировать нельзя | |
ListBox | (Name) | lstOrders | |
Dock | Bottom |
Форма на этапе проектирования должна выглядеть так
- Создайте для события SelectedIndexChanged объекта cbEmployees обработчик и его же присоедините к событию BindingContextChanged для начального заполнения списка lstOrders
- Добавьте в класс Form1 метод LoadTables(), который загружает таблицы Employees и Orders из БД с помощью динамически созданного поставщика данных и SQL-запроса, а также связывает раскрывающийся список с таблицей Employees
Полный код файла Form1 для проекта 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.Collections; namespace WinForms5 { public partial class Form1 : Form { public Form1() { InitializeComponent(); LoadTables(); } //*********************************************************** // Строка соединения с абсолютным путем к БД, определяемым сборкой // Не используем !!!!!! Заменили объектом-построителем 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"; } //********************************************************** // Поле-ссылка на таблицу Orders DataTable tableOrders; void LoadTables() { // Используем построитель строки подключения // для облегчения формирования оной! OleDbConnectionStringBuilder objConnectionStringBuilder = new OleDbConnectionStringBuilder(); objConnectionStringBuilder.Provider = "Microsoft.Jet.OLEDB.4.0"; objConnectionStringBuilder.DataSource = Application.StartupPath.ToString() + @"\Data\Northwind.mdb"; objConnectionStringBuilder.PersistSecurityInfo = true;// Шифровать строку // Строка соединения с источником данных String strConnection = objConnectionStringBuilder.ToString(); // Строка запроса String strSQL = "SELECT EmployeeID, LTRIM(RTRIM(LastName)) + ', '" + "+ LTRIM(RTRIM(FirstName)) AS FullName FROM Employees"; // Создаем поставщик данных для таблицы Employees OleDbDataAdapter adapter = new OleDbDataAdapter(strSQL, strConnection); // Создаем и заполняем виртуальную таблицу DataTable tableEmployees = new DataTable(); adapter.Fill(tableEmployees); tableEmployees.TableName = "Employees"; // Сортируем в прямом порядке: "FullName" или "FullName ASC" // Сортировка в обратном порядке: "FullName DESC"; tableEmployees.DefaultView.Sort = "FullName ASC"; // Связываем ComboBox с виртуальной таблицей //cbEmployees.DataSource = tableEmployees; //Связать таблицу несортированной // Связать через DataView сортированной cbEmployees.DataSource = tableEmployees.DefaultView; cbEmployees.DisplayMember = "FullName"; cbEmployees.ValueMember = "EmployeeID"; cbEmployees.SelectedIndex = 0; // Заполняем виртуальную таблицу Orders всеми записями OleDbCommand selectCommand = new OleDbCommand( "SELECT OrderID, EmployeeID, ShipAddress FROM Orders"); selectCommand.Connection = new OleDbConnection(strConnection); adapter = new OleDbDataAdapter(selectCommand); tableOrders = new DataTable(); adapter.Fill(tableOrders); } private void cbEmployees_SelectedIndexChanged(object sender, EventArgs e) { if (tableOrders == null) return; // Выбираем строки по условию String filterExpression = "EmployeeID = " + cbEmployees.SelectedValue; DataRow[] rows = tableOrders.Select( filterExpression, // Выражение для фильтра "ShipAddress ASC"); // Поле сортировки по возрастанию // "ShipAddress DESC" - сортировка по убыванию!!! // Очищаем список lstOrders.Items.Clear(); // Заполняем список foreach (DataRow row in rows) { lstOrders.Items.Add( "(" + row["EmployeeID"] + ") " + row["OrderID"].ToString() + "\t" + row["ShipAddress"]); } } } }
- Запустите проект - по выбранному в объекте cbEmployees сотруднику производится выборка закрепленных за ним заказов из таблицы Orders и заполнение списка новой информацией. Соединение с БД выполняется только один раз при формировании таблиц в кэше
Мы старались разнообразить код. Например, для формирования строки подключения мы воспользовались вспомогательным классом OleDbConnectionStringBuilder, а при создании адаптера применяли разные перегрузки его конструктора. Метод Select() объекта DataTable производит выборку строк по выражению, которое равноценно условию, применяемому в SQL-запросе после ключевого слова WHERE. Меняя это выражение можно получать различные представления объектной модели таблицы данных.