|
При выполнении в лабораторной работе упражнения №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();
}-
Запустите приложение
и поэкспериментируйте с его функциональностью, заложенной нами
