При выполнении в лабораторной работе упражнения №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" или один из зависимых от них компонентов. Не удается найти указанный файл. Делаю все пунктуально. В чем может быть проблема? |
Разработка приложений ADO.NET для OLE DB
Фильтрация данных в связанном списке
Метод Fill() поставщика данных загружает все данные указанных столбцов таблицы в набор данных. Часто не все данные нужны пользователю, к тому же их может быть очень много, что перегружает ресурсы компьютера. В этом разделе будет показано, как создать параметризованный оператор SQL для заполнения набора данных не всеми строками таблицы БД, а пока только одной. Мы продолжим развитие нашего проекта, который ограничивает выборку данных из источника определенным условием, а заодно и установим строку подключения к БД вручную.
Если выделить объект строки подключения и посмотреть свойство ConnectionString, то можно убедиться, что оно имеет следующее строковое значение:
Provider=Microsoft.Jet.OLEDB.4.0; Data Source=|DataDirectory|\Northwind.mdb;Persist Security Info=True
Переопределим его программно на другое значение.
- Вставьте в класс Form1 следующий код
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace FormsADO { public partial class Form1 : Form { public Form1() { InitializeComponent(); } String ConnectionString(String fileNameNotExt) { string JetEngineString = @"Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Engine Type=5;Data Source="; string pathToFile = Application.StartupPath.ToString() + "\\Data\\"; return JetEngineString + pathToFile + fileNameNotExt.Trim() + ".mdb"; } private void Form1_Load(object sender, EventArgs e) { // Задаем строку соединения oleDbConnection1.ConnectionString = ConnectionString("Northwind"); // Заполняем набор данных настроенным адаптером данных oleDbDataAdapter1.Fill(dataSet11); // Устанавливаем курсор списка в конец listBox.SelectedIndex = listBox.Items.Count - 1; } } }
- В панели Solution Explorer для узла проекта FormsADO вызовите контекстное меню, командой Add/New Folder добавьте каталог Data и курсором перенесите в него БД Northwind.mdb
- Выделите файл БД и через панель Properties убедитесь, что его свойство Copy to Output Directory установлено в значение Copy if newer
- Запустите приложение - программа FormsADO.exe работает нормально
Теперь установим фильтр на заполнение данными набора данных DataSet через команду SQL -запроса. Если открыть файл Form1.Designer.cs, то мы увидим примерно следующий код в методе InitializeComponent() формы
private void InitializeComponent() { this.oleDbSelectCommand1 = new System.Data.OleDb.OleDbCommand(); this.oleDbConnection1 = new System.Data.OleDb.OleDbConnection(); this.oleDbDataAdapter1 = new System.Data.OleDb.OleDbDataAdapter(); this.dataSet11 = new FormsADO.DataSet1(); this.listBox = new System.Windows.Forms.ListBox(); ((System.ComponentModel.ISupportInitialize)(this.dataSet11)).BeginInit(); this.SuspendLayout(); // // oleDbSelectCommand1 // this.oleDbSelectCommand1.CommandText = "SELECT CustomerID, CompanyName\r\nFROM Customers"; this.oleDbSelectCommand1.Connection = this.oleDbConnection1; // // oleDbConnection1 // this.oleDbConnection1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\\Northwind.mdb;Persis" + "t Security Info=True"; // // oleDbDataAdapter1 // this.oleDbDataAdapter1.SelectCommand = this.oleDbSelectCommand1; this.oleDbDataAdapter1.TableMappings.AddRange(new System.Data.Common.DataTableMapping[] { new System.Data.Common.DataTableMapping("Table", "Customers", new System.Data.Common.DataColumnMapping[] { new System.Data.Common.DataColumnMapping("CustomerID", "CustomerID"), new System.Data.Common.DataColumnMapping("CompanyName", "CompanyName")})}); ........................................... } ............................................... private System.Data.OleDb.OleDbCommand oleDbSelectCommand1;
Обратите внимание на выделенные строки в приведенном листинге. Объявляется поле-ссылка на объект команд oleDbSelectCommand1, затем создается сам объект, его свойству CommandText присваивается SQL-запрос и, наконец, объект команд подключается к одноименному свойству объекта адаптера данных. Теперь метод Fill() адаптера данных будет выбирать из БД нужные данные и передавать их набору данных DataSet. Если в коде события Load формы поменять команду в свойстве CommandText, то она и будет выполняться адаптером данных.
Таким образом, изменим для адаптера команду выборки данных из БД и добавим к форме необходимый для этого пользовательский интерфейс.
- Добавьте в обработчик события Load формы код перенастройки объекта oleDbSelectCommand1
private void Form1_Load(object sender, EventArgs e) { // Настраиваем объект команд oleDbSelectCommand1.CommandText = "SELECT CustomerID, CompanyName FROM Customers\r\n" + "WHERE (CompanyName LIKE ? + '%')"; oleDbSelectCommand1.Parameters.Add(new System.Data.OleDb.OleDbParameter()); oleDbSelectCommand1.Parameters[0].Value = "A"; // Задаем строку соединения oleDbConnection1.ConnectionString = ConnectionString("Northwind"); // Заполняем набор данных настроенным адаптером данных oleDbDataAdapter1.Fill(dataSet11); // Устанавливаем курсор списка в конец listBox.SelectedIndex = listBox.Items.Count - 1; }
В данном коде пояснения требует только SQL-команда, написанная на диалекте SQL для формата файловых баз данных, принятого в Microsoft Office Access 2003
SELECT CustomerID, CompanyName FROM Customers\r\n" + "WHERE (CompanyName LIKE ? + '%')
- \r\n - управляющие символы "возврат каретки - перевод строки"
- WHERE условие - условие отбора данных из источника
-
LIKE шаблон - проверка на соответствие заданному шаблону,
в котором могут использоваться специальные символы, означающие подстановки
значений параметров команды. В качестве шаблона поиска могут быть использованы
два подстановочных знака
- ? - одиночный символ в текущей позиции
- % - любое количество символов в текущей позиции
В нашем случае выражение после ключевого слова LIKE означает в своей совокупности, что поиск данных в источнике будет проведен по любому значению, которое введет пользователь в текстовое поле формы. Следуеть помнить, что если в команде присутствует LIKE шаблон, то даже если для поля поиска существует индекс, то он не работает, а проверка условия выполняется последовательным перебором всех записей таблицы от начала до конца. Это очень замедляет выборку данных на таблицах с большим количеством записей.
- Измените свойство Dock экземпляра класса ListBox с Fill на Bottom и освободите место сверху клиентской области формы
- Поместите на форму, как ее дочерние элементы, экземпляры компонентов Label, TextBox, Button в соответствии со снимком и настройте их как показано в таблице свойств ниже
Тип | Свойство | Значение |
---|---|---|
ListBox | Dock | Bottom |
Label | Text | Customer |
TextBox | (Name) | txtCustLimit |
Text | A (латинское) | |
Button | (Name) | btnLoadList |
Text | Load |
- Создайте обработчик события Click кнопки btnLoadList и заполните его кодом переназначения содержимого параметра SQL-запроса
private void btnLoadList_Click(object sender, EventArgs e) { NewLoad(); } void NewLoad() { // Извлекаем значение текстового поля без пробелов String text = txtCustLimit.Text.Trim(); txtCustLimit.Text = text; // Сохраняем без пробелов для удобства oleDbSelectCommand1.Parameters[0].Value = text;// Устанавливаем значение параметра // Очищаем набор данных dataSet11.Clear(); // Заполняем набор данных командой с новым значением параметра oleDbDataAdapter1.Fill(dataSet11); // Устанавливаем курсор списка в конец listBox.SelectedIndex = listBox.Items.Count - 1; }
- Создайте обработчик события KeyDown для текстового поля txtCustLimit с тем, чтобы набор данных обновлялся и по нажатию пользователем клавиши Enter при завершении ввода очередного значения параметра, и заполните его следующим кодом
private void txtCustLimit_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) NewLoad(); }
- Запустите приложение и поэкспериментируйте с его функциональностью, заложенной нами