- •О.С. Зеленський
- •Розділ 9. Структура створення додатків
- •9.1. Загальна структура додатків
- •9.2. Додатки без використання архітектури «Документ-вид»
- •9.2.1. Приклад додатку реєстрації wnd-класу вікна
- •9.2.2. Створення та видалення дочірніх вікон без використання архітектури «Документ-Вид»
- •9.2.3. Створення дочірніх вікон без використання архітектури «Документ-Вид» (переключення вікон з використанням функції ShowWindow)
- •9.3. Архітектура «Документ-Вид»
- •Idr_mainframe формат строкового ресурсу.
- •9.3.1. Приклад додатку з використанням архітектури «Документ-Вид»
- •9.3.2. Види у архітектурі «Документ-Вид»
- •9.3.3. Створення видів у архітектурі «Документ-Вид» (переключення видів з використанням функції ShowWindow)
- •9.3.4. Робота з документами та видами на прикладі додатку SingleTemplate
- •9.4. Додатки mdi, робота з шаблонами
- •9.4.1. Приклад додатку mdi з одним шаблоном
- •9.4.2. Приклад додатку mdi з декількома шаблонами
- •Контрольні питання
- •Розділ 10. Робота з базами даних з використанням об'єктів ado
- •10.1.1. Ініціалізація об'єктів com з використанням директиви #import
- •10.1.2. Підтримка класів сом
- •10.2. Об'єкт Connection
- •10.3. Об'єкт Command
- •10.4. Об'єкт Recordset
- •10.5. Об'єкт Field і колекція Fields
- •10.6. Об'єкт Error і колекція Errors
- •10.8. Коротка характеристика структури мови sql
- •10.9. Синтаксис оператора вибору Select
- •10.10. Приклад програмування об'єктів ado
- •10.11. Опис розробленого навчального пакету ado6 для роботи з базами даних access та MySql
- •Int tip_bd; // тип бд 1- ms access, 2- MySql, 3 - xml
- •Void Connect_Baza(cString str);
- •Void ErrMessage(_com_error &ce);
- •If(pConn.CreateInstance("adodb.Connection"))
- •If(pRecordset.CreateInstance("adodb.RecordSet"))
- •Void cAdo6Doc::ErrMessage(_com_error &ce)
- •Void cAdo6Doc::OnMsaccess()
- •Void cAdo6Doc::OnMysql()
- •Void cAdo6Doc::OnXmlRead()
- •Void cAdo6Doc::Connect_Baza(cString str)
- •Virtual void DoDataExchange(cDataExchange* pDx);
- •Void cAdo6Dlg::DoDataExchange(cDataExchange* pDx)
- •Void cAdo6Dlg::Struct_MySql()
- •Void cAdo6Dlg::OnSelchangeListBaza()
- •Void cAdo6Dlg::OnVibor_bd()
- •Void cAdo6Dlg::AccessOpen()
- •Void cAdo6Dlg::xmlOpen()
- •Void cAdo6Dlg::Structura_bd()
- •Void cAdo6Dlg::OnSelchangeListTab()
- •Void cAdo6Dlg::show(int kod, int kod_bd)
- •Void cAdo6Dlg::Recordset_Baza(cString str)
- •Void cAdo6Dlg::OnClose()
- •10.11.2. Формування списку бд (MySql), відкриття бази даних (ms access), відкриття xml-файлу, формування списку таблиць (MySql і ms access) та полів (MySql, ms access, xml)
- •Void cAdo6Dlg::OnSelchangeListTab()
- •1. Обрану таблицю необхідно брати в зворотні лапки "`", щоб виключити помилку в тому випадку, якщо в імені таблиці будуть зустрічатися пробіли.
- •10.11.3. Робота з sql-запитами
- •Void cAdo6Dlg::OnZapros_Select()
- •If (str_query.Mid(0,6).Compare("select"))
- •If(!baza.Left(3).Compare("otl") &&
- •Void cAdo6Dlg::Recordset_Baza(cString str)
- •Void cado6Dlg::OnZapros_Make()
- •Vr_zap.Format(" Запрос выполнен за %f сек ",conec - nach);
- •10.11.4. Видалення, сортування, пошук, фільтрація, оновлення набору записів
- •Void cado6Dlg::OnZapis_Delete()
- •Void cado6Dlg::OnCheck_Sort()
- •Void cado6Dlg::OnFind()
- •0L,adSearchForward,bb);
- •Void cado6Dlg::OnFilter()
- •Void cado6Dlg::OnVozvrat()
- •10.11.5. Переходи по записах
- •Void cado6Dlg::OnButtonFirst()
- •Void cado6Dlg::OnButtonLast()
- •Void cado6Dlg::OnButtonLeft()
- •Void cado6Dlg::OnButtonRight()
- •Void cado6Dlg::OnButtonRecno()
- •Void cado6Dlg::OnButtonPgup()
- •Void cado6Dlg::OnButtonPgdn()
- •Void cado6Dlg::OnButtonBookmark()
- •10.11.6. Запис даних до xml-файлу
- •Void cAdo6Dlg::OnButtonSave()
- •10.11.7. Кнопки, призначені тільки для роботи з otl_tab
- •Void cado6Dlg::OnZapis_Add1()
- •Void cado6Dlg::OnZapis_Add2()
- •Void cado6Dlg::OnZapis_Update1()
- •Void cado6Dlg::OnZapis_Update2()
- •Void cado6Dlg::OnFormir_bd()
- •Void cAdo6Dlg::OnValues_Fields()
- •10.12. Використання у якості джерела даних електронної таблиці Excel
- •Контрольні питання
- •Завдання
- •Розділ 11. Програмування для інтернет
- •11.1. Створення броузера
- •11.3. Використання протоколу http
- •If ((pInternetSession)
- •11.4. Використання протоколу ftp
- •Контрольні питання
- •Розділ 12. Створення елементів activex
- •12.1. Створення елементів ActiveX
- •Invalidate();
- •12.2. Тестування елемента ActiveX
- •12.4. Створення елемента ActiveX на базі стандартних елементів
- •12.5. Відображення елементів ActiveX
- •Контрольні питання
- •Розділ 13. Налагодження програм
- •Int data[5];
- •Invalidate();
- •13.3. Установка точки переривання
- •13.2. Покрокове виконання програми
- •13.4. Перевірка значень змінних під час виконання програми
- •Контрольні питання
- •Список літератури
- •Додатки
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), а також кнопки <Запрос на выборку>, <Запрос на выполнение>, <Формирование БД>.