Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Visual2.doc
Скачиваний:
5
Добавлен:
07.03.2016
Размер:
3.31 Mб
Скачать

Void cAdo6Dlg::OnSelchangeListTab()

{

CString str;

m_pol.ResetContent();

if (m_tab.GetCurSel()<0)

{

MessageBox("Таблиця не вибрана");

return;

}

m_tab.GetText (m_tab.GetCurSel(), str);

table = str;

table.MakeUpper();

str = "`"+str+"`";

_RecordsetPtr PRec;

// Створення об'єкта Recordset через об'єкт Connection

// 1-й параметр - ім'я таблиці

// 2-й параметр - кількість повертаємих записів

// Оскільки Recordset створюється на стороні сервера даний параметр не враховується і дорівнює нулю.

// 3-й параметр adCmdTable вказує, що Recordset створюється за вказаним ім’ям таблиці

pRec = pConn->Execute((_bstr_t)str, 0, adCmdTable);

for (long i=0; i<pRec->GetFields()->GetCount(); i++)

{

str = (char *)(_bstr_t) pRec->GetFields()->

GetItem ((_variant_t) i)->GetName();

str += "-";

str += (_bstr_t)(long) pRec->GetFields()->

GetItem ((_variant_t)i)->GetType();

m_pol.AddString(str);

}

pRec->Close();

// Виведення запиту за таблицею лістбокса

str = "SELECT * FROM";

str = str +"`"+table+"`";

m_editquery.SetWindowText(str);

OnZapros_Select();

GetDlgItem(IDC_STATIC2)->SetWindowText(

"Робота з таблицею"+table);

}

У даній функції у список m_pol виводиться інформація про поля вибраної таблиці із зазначенням їхніх типів. Для цього доцільно повернути об'єкт Recordset обраної таблиці із використанням функцій GetName() і GetType() об'єкта Field повернути дані про ім'я і тип відповідного поля. Детальна інформація про типи полів представлена у табл. 10.9. Крім того, при виборі конкретної таблиці, в елемент управління Datagrid повертається результат SQL-запиту (функція OnZapros_Select()).

У функції OnSelchangeListTab() слід звернути увагу на кілька особливостей:

1. Обрану таблицю необхідно брати в зворотні лапки "`", щоб виключити помилку в тому випадку, якщо в імені таблиці будуть зустрічатися пробіли.

2. Вхідним параметром у функцію GetItem() сімейства Fields є універсальний об'єкт типу _variant_t. Зроблено це для того, щоб можна було увійти як індексом, так і ім'ям поля. У даному випадку використовується індексна змінна i типу long, яка приводиться до типу _variant_t. У тому випадку, якщо необхідно привести функцію або властивість, яка повертає тип даних int, спочатку необхідно привести її до типу long, а потім до типу _variant_t - (наприклад, (_variant_t) (long) i), оскільки в класі _variant_t немає перевантаження на тип даних int.

У таблиці 10.22 наведені функціональні призначення для користувача функцій відгуку, які відповідають певним ідентифікаторами.

Таблиця 10.22

Користувацькі функції відгуків

Назва кнопки

Ідентифікатор

Назва функції

Призначення

Відкриття бази даних MS ACCESS (*.mdb) або xml-файлу

Выбор базы или xml-файла

IDC_BUTTON_VIBORBD

On_Vibor_BD

Вибір бази даних для MS ACCESS (*.mdb) або xml-файлу (*.xml)

Робота із SQL-запитами

Запрос на выборку

IDC_BUTTON_SELECT

OnZapros_Select

Формування об'єкта Recordset як результату запиту на вибірку

Запрос на выполнение

IDC_BUTTON_MAKE

OnZapros_Make

Виконання змін у БД

Видалення, сортування, пошук, фільтрація, оновлення набору записів

Удаление

IDC_BUTTON_DELETE

OnZapis_Delete

Видалення поточного запису

Сортировка

IDC_CHECK_SORT

OnCheck_Sort

Сортування записів у наборі

Поиск

IDC_BUTTON_FIND

OnFind

Пошук значення в таблиці

Фильтр

IDC_BUTTON_FILTER

OnFilter

Фільтрація записів у наборі

Возврат

IDC_BUTTON_VOZVRAT

OnVozvrat

Оновлення набору записів

Переходи по записах

First

IDC_BUTTON_FIRST

OnButtonFirst

Перехід на перший запис

Last

IDC_BUTTON_LAST

OnButtonLast

Перехід на останній запис

IDC_BUTTON_LEFT

OnButtonLeft

Перехід на попередній запис

IDC_BUTTON_RIGHT

OnButtonRight

Перехід на наступний запис

PgUp

IDC_BUTTON_PGUP

OnButtonPgup

Перехід на попередню сторінку

PgDn

IDC_BUTTON_PGDN

OnButtonPgdn

Перехід на наступну сторінку

BookMark

IDC_BUTTON_BOOKMARK

OnButtonBookmark

Перехід на закладку з номером 5

Recno

IDC_BUTTON_RECNO

OnButtonRecno

Перехід на запис з номером 5

Запис даних до xml-файлу

SAVE

IDC_BUTTON_SAVE

OnButtonSave

Запис даних набору до xml-файлу

Кнопки, призначені тільки для роботи з otl_tab

Добавление 1

IDC_BUTTON_ADD1

OnZapis_Add1

Додавання записів до таблиці otl_tab за допомогою функції AddNew() з параметрами

Добавление 2

IDC_BUTTON_ADD2

OnZapis_Add2

Додавання записів до таблиці otl_tab з використанням доступу до полів об'єкта

Продовження таблиці 10.22

Назва кнопки

Ідентифікатор

Назва функції

Призначення

Обновление 1

IDC_BUTTON_UPDATE1

OnZapis_Update1

Оновлення поточного запису з використанням функції Update() з параметрами

Обновление 2

IDC_BUTTON_UPDATE2

OnZapis_Update2

Оновлення поточного запису з використанням доступу до полів об'єкта

Значение полей

IDC_BUTTON_FIELDS

OnValues_Fields

Виведення значень полів і розрахункові операції

Формирование БД

IDC_BUTTON_FORMIRBD

OnFormir_BD

Формування бази даних із заданими порціями записів

Дані функції відгуків розбиті на незалежні групи, які будуть відповідати назвам розділів методичних вказівок. Слід зазначити, що останній розділ таблиці, "Кнопки, призначені тільки для роботи з otl_tab", включає в себе роботу з 6-ма функціями, які демонструють найбільш повну роботу з набором записів, наприклад додавання та оновлення записів. Розглянемо кожен розділ окремо.

Опишемо функції вибору бази даних MS ACCESS (AccessOpen) або xml-файлу (XMLOpen), які визиваються з функції відгуку OnVibor_BD в залежності від змінної tip_bd (блок 9, рис. 10.8).

У функції AccessOpen відкривається база даних з розширенням mdb за допомогою використання стандартного класу відкриття діалогу CFileDialog. Потім в змінну str_con класу CString записується повний шлях до файлу БД з тією метою, щоб визначити ім'я бази даних. Потім за допомогою функції MakeLower() класу CString всі букви перетворюються до нижнього регістру, після чого здійснюється пошук імені файлу бази даних, розташованого після останнього символу "\". Наведемо фрагмент даного пошуку файлу БД:

.............................................................

int g;

while(1)

{

g = str_con.Find('\\',0);

if (g == -1) break;

str_con = str_con.Mid(g+1);

}

.............................................................

У даному фрагменті, у вічному циклі в змінну g постійно зчитується позиція символу "\" в рядку повного маршруту str_con з використанням методу Find() класу CString. Пошук відбувається з початку рядка (нульова позиція). У тому випадку, якщо досягнуто кінець рядка, функція повертає -1 і здійснюється вихід з циклу. В іншому випадку рядок маршруту скорочується, починаючи з символу, наступного за символом "\". Скорочується рядок з використанням методу Mid() класу CString. Таким чином, у змінній str_con залишається тільки ім'я бази даних, що слідує за останнім символом "\" в рядку повного маршруту.

На наступному етапі викликається функція Connect_Baza(), в якій відбувається відкриття (Open()) об'єкта Connection, який призначений для з’єднання з базою даних. З'єднання відкривається, використовуючи провайдер OLEDB. Параметри ім'я користувача, пароль і режим з'єднання встановлено за умовчанням. Режим з'єднання за замовчуванням - синхронний, тобто завжди очікується результат останнього запиту. Якщо при відкритті з'єднання виникає помилка, - спрацьовує блок catch, в якому викликається універсальна функція обробки помилок ErrMessage(), вказівка pConn обнуляється і здійснюється вихід з функції.

При відкритті довільної БД на екрані дисплея буде показано обмежене число елементів керування (show(SW_SHOW,1)).

На наступному етапі викликається функція виведення структури БД Structura_BD(). У даній функції ми отримуємо список таблиць обраної бази даних.

У функції XMLOpen відкривається раніше збережений набір даних з розширенням xml. Так як робота відбувається з однією таблицею, приховується список таблиць (IDC_LIST_TAB), а також кнопки <Запрос на выборку>, <Запрос на выполнение>, <Формирование БД>.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]