Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЗАДАНИЕ НА 6 ФЕВРАЛЯ 2015 Г.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
654.36 Кб
Скачать

Упражнение 2. Выборочный просмотр таблицы с помощью объектов DbCommand и DbDataReader

Часто пользователь хочет просмотреть часть результатов, хранящихся в некоторой таблице БД. Здесь также может пригодиться модульчтения DbDataReader. В данном упражнении мы разработаем форму, в которой пользователь выбирает из раскрывающегося списка конкретного служащего и просматривает заказы, обслуживаемые этим сотрудником. Здесь мы вновь будем использовать файловую БДNorthwind.mdb, схема связей которой изображена на рисунке, построенном в MS Office Access:

  • Добавьте к решению ADO командой File/Add/New Project новый проект с именем WinForms2 и назначьте его стартовым командой Project/Set as StartUp Project

увеличить изображение

  • В панели Solution Explorer создайте папку Data для корневого узла проекта командой Add/New Folder и скопируйте в нее перетаскиванием мышью через панель Solution Explorer из предыдущего проекта файл Northwind.mdb. При появлении мастераData Source Configuration Wizard отмените его кнопкой Cancel

  • Поместите на форму из панели Toolbox нужные компоненты и настройте их в соответствии с таблицей свойств

Компонент

Свойство

Значение

Form

Text

Упражнение 2

 

MaximizeBox

False

Label

Text

Сотрудник:

ComboBox

(Name)

cbEmployees

ListBox

(Name)

lstCustomers

 

Dock

Bottom

Вначале мы заполним раскрывающийся список ComboBox сотрудниками, обслуживающими заказы. Список будем заполнять в конструкторе формы.

  • Модифицируйте файл Form1.cs следующим образом

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 WinForms2

{

public partial class Form1 : Form

{

// Создаем объект списка сотрудников

ArrayList dbEmployeesList = new ArrayList();// Поле

public Form1()

{

InitializeComponent();

LoadEmployees();

}

// Строка соединения с абсолютным путем к БД, определяемым сборкой

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";

}

// Заполнение раскрывающегося списка из БД

void LoadEmployees()

{

// Создаем объект соединения

OleDbConnection objConnection =

new OleDbConnection(ConnectionString("Northwind"));

// Создаем объект команды

OleDbCommand objCommand = new OleDbCommand(

"SELECT EmployeeID, RTRIM(LastName) + ', ' + RTRIM(FirstName) AS FullName FROM Employees",

objConnection);

// Открываем соединение

objConnection.Open();

// Читаем в DbDataReader

OleDbDataReader reader = objCommand.ExecuteReader();

// Заполняем автономный список записей

foreach (DbDataRecord rec in reader)

{

dbEmployeesList.Add(rec);

}

// Закрываем соединение

objConnection.Close();

// Связываем автономный список записей с ComboBox

cbEmployees.BeginUpdate();

cbEmployees.DataSource = dbEmployeesList;

cbEmployees.DisplayMember = "FullName";

cbEmployees.ValueMember = "EmployeeID";

cbEmployees.EndUpdate();

cbEmployees.SelectedIndex = 0;// Устанавливаем на первый элемент

}

}

}

  • Запустите проект WinForms2 и убедитесь, что раскрывающийся список заполняется информацией из таблицы Employees БДNorthwind

Теперь, по выбранному сотруднику, мы сформируем список заказов из таблицы Orders, которые этот сотрудник обслуживает. Причем, в этом списке нам нужен будет только идентификатор заказчиков, сделавших заказ. В дальнейшем, загружая информацию из таблицы заказчиков ( Customers ), мы выбирем только тех из них, которые делали заказы у заданного сотрудника. Останется только отобразить этих заказчиков пользователю.

  • Создайте обработчик события SelectedIndexChanged для объекта cbEmployees и дополните класс Form1 проектаWinForms2 следующим кодом

private void cbEmployees_SelectedIndexChanged(object sender, EventArgs e)

{

LoadOrders(); // Выбираем информацию из таблицы Orders

// Прореживаем список

ArrayList tmpList = new ArrayList();

for (int i = 0; i < ordersCustomerID.Count; i++)

{

object val = ordersCustomerID[i];

if (tmpList.IndexOf(val) == -1)

tmpList.Add(val);

}

//ordersCustomerID = tmpList.Clone() as ArrayList;

ordersCustomerID = tmpList; // Бросаем старый список

ordersCustomerID.Sort(); // Сортируем список

lstCustomers.Items.Clear(); // Чистим ListBox

// Отображаем список

for (int i = 0; i < ordersCustomerID.Count; i++)

lstCustomers.Items.Add(ordersCustomerID[i]);

}

// Получение всех закрепленных за сотрудником заказов

ArrayList ordersCustomerID = new ArrayList();

void LoadOrders()

{

if (cbEmployees.SelectedIndex == -1)

return;

// Создаем объект соединения

OleDbConnection objConnection =

new OleDbConnection(ConnectionString("Northwind"));

// Создаем объект команды

OleDbCommand objCommand = new OleDbCommand(

"SELECT CustomerID FROM Orders WHERE (EmployeeID = ?)",

objConnection);

objCommand.Parameters.Add(new OleDbParameter());

objCommand.Parameters[0].Value = cbEmployees.SelectedValue.ToString();

objConnection.Open(); // Открываем соединение

OleDbDataReader reader = objCommand.ExecuteReader();// Читаем в DbDataReader

if (reader.HasRows)

{

// Чистим список

ordersCustomerID.Clear();

while(reader.Read())

{

ordersCustomerID.Add(reader["CustomerID"]);

}

}

objConnection.Close(); // Закрываем соединение

}

  • Запустите проект - список lstCustomers заполняется неповторяющимися идентификаторами заказчиков из поля CustomerID

Обратите внимание, что список lstCustomers заполняется только после явного выбора служащего в объекте cbEmployees при возбуждении события cbEmployees.SelectedIndexChanged, но при первом запуске формы остается пустым. Можно это так и оставить, но лучше - пусть заполняется и в самом начале.

  • Выделите на форме объект cbEmployees, в панели Properties установите режим Events, найдите событиеBindingContextChanged и подпишите его на уже существующий обработчик cbEmployees_SelectedIndexChanged()

  • Запустите проект - теперь список заполняется и в самом начале появления формы на экране

Задача, которую мы поставили в данном упражнении, решена еще не полностью. Цель заключалась в просмотре заказчиков по выбранному служащему, а пока отображаются только идентификаторы заказчиков. Теперь нужно из таблицы Customers для каждогоCustomerID, закрепленного за выбранным служащим, запросить значение поля CompanyName и отобразить в списке lstCustomers.

  • Модифицируйте класс Form1 проекта WinForms2 следующим образом

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 WinForms2

{

public partial class Form1 : Form

{

// Создаем объект списка сотрудников

ArrayList dbEmployeesList = new ArrayList();// Поле

public Form1()

{

InitializeComponent();

LoadEmployees();

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";

}

// Заполнение раскрывающегося списка из БД

void LoadEmployees()

{

// Создаем объект соединения

OleDbConnection objConnection =

new OleDbConnection(ConnectionString("Northwind"));

// Создаем объект команды

OleDbCommand objCommand = new OleDbCommand(

"SELECT EmployeeID, RTRIM(LastName) + ', ' + RTRIM(FirstName) AS FullName FROM Employees",

objConnection);

// Открываем соединение

objConnection.Open();

// Читаем в DbDataReader

OleDbDataReader reader = objCommand.ExecuteReader();

// Заполняем автономный список записей

foreach (DbDataRecord rec in reader)

{

dbEmployeesList.Add(rec);

}

// Закрываем соединение

objConnection.Close();

// Связываем автономный список записей с ComboBox

cbEmployees.BeginUpdate();

cbEmployees.DataSource = dbEmployeesList;

cbEmployees.DisplayMember = "FullName";

cbEmployees.ValueMember = "EmployeeID";

cbEmployees.EndUpdate();

cbEmployees.SelectedIndex = 0;// Устанавливаем на первый элемент

}

private void cbEmployees_SelectedIndexChanged(object sender, EventArgs e)

{

LoadOrders(); // Выбираем информацию из таблицы Orders

// Прореживаем список

ArrayList tmpList = new ArrayList();

for (int i = 0; i < ordersCustomerID.Count; i++)

{

object val = ordersCustomerID[i];

if (tmpList.IndexOf(val) == -1)

tmpList.Add(val);

}

//ordersCustomerID = tmpList.Clone() as ArrayList;

ordersCustomerID = tmpList; // Бросаем старый список

ordersCustomerID.Sort(); // Сортируем список

lstCustomers.Items.Clear(); // Чистим ListBox

// Отображаем список

for (int i = 0; i < ordersCustomerID.Count; i++)

{

//lstCustomers.Items.Add(ordersCustomerID[i]);

int index = customerID.IndexOf(ordersCustomerID[i]);

lstCustomers.Items.Add(customerID[index] + "\t - " + companyName[index]);

}

}

// Читаем таблицу заказчиков Customers

ArrayList companyName = new ArrayList();

ArrayList customerID = new ArrayList();

void LoadCustomers()

{

OleDbConnection objConnection =

new OleDbConnection(ConnectionString("Northwind"));

OleDbCommand objCommand = new OleDbCommand(

"SELECT CustomerID, CompanyName FROM Customers",

objConnection);

objConnection.Open();

OleDbDataReader reader =

objCommand.ExecuteReader(CommandBehavior.CloseConnection);

while (reader.Read())

{

customerID.Add(reader.GetString(0));

companyName.Add(reader.GetString(1));

}

reader.Close();

}

// Получение всех закрепленных за сотрудником заказов

ArrayList ordersCustomerID = new ArrayList();

void LoadOrders()

{

if (cbEmployees.SelectedIndex == -1)

return;

// Создаем объект соединения

OleDbConnection objConnection =

new OleDbConnection(ConnectionString("Northwind"));

// Создаем объект команды

OleDbCommand objCommand = new OleDbCommand(

"SELECT CustomerID FROM Orders WHERE (EmployeeID = ?)",

objConnection);

objCommand.Parameters.Add(new OleDbParameter());

objCommand.Parameters[0].Value = cbEmployees.SelectedValue.ToString();

objConnection.Open(); // Открываем соединение

OleDbDataReader reader = objCommand.ExecuteReader();// Читаем в DbDataReader

if (reader.HasRows)

{

// Чистим список

ordersCustomerID.Clear();

while(reader.Read())

{

ordersCustomerID.Add(reader["CustomerID"]);

}

}

objConnection.Close(); // Закрываем соединение

}

}

}

  • Запустите проект - все работает как задумали