- •О.С. Зеленський
- •Розділ 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. Перевірка значень змінних під час виконання програми
- •Контрольні питання
- •Список літератури
- •Додатки
10.11.2. Формування списку бд (MySql), відкриття бази даних (ms access), відкриття xml-файлу, формування списку таблиць (MySql і ms access) та полів (MySql, ms access, xml)
У даному розділі всі операції з формування списку БД (для MySQL), відкриття бази даних (для MS ACCESS), відкриття файлу (для XML), а також формування списку таблиць БД і відповідних полів кожної таблиці (MySQL, MS ACCESS, XML), виконуються у функціях Struct_MySQL(), On_Vibor_BD() (кнопка <Вибір бази>), AccessOpen(), XMLOpen() Structura_BD(), текст яких наведено вище.
Для отримання структури довільної БД використовується метод OpenSchema() об'єкта Connection. Даний метод повертає об'єкт Recordset тільки для читання. Головним його параметром є параметр QueryType (тип запиту схеми), який говорить про те, яку саме інформацію про структуру БД потрібно отримати. Решта два параметри можуть бути прийняті за замовчуванням. Вхідний параметр QueryType відповідає перерахованій змінній типу enum області ADODB. Так, якщо необхідно отримати інформацію про бази даних, використовується змінна adSchemaCatalogs, про таблиці - adSchemaTables, для отримання інформації по індексних файлах - adSchemaIndexes і т.д.
У функції Struct_MySQL() (блок 4, рис. 10.8) здійснюється формування списку з базами даних. Для відбору всіх БД MySQL, окрім системних з даними певної БД, необхідно порівняти відповідну базу даних з системною. У MySQL мають місце дві системні БД: mysql і information_schema. У кінцевому підсумку дані з об'єкта Recordset pBaza будуть записані в список m_baza.
При виборі певної бази даних MySQL зі списку (блок 5, рис. 10.8) або відкритті БД MS ACCESS (блок 9, рис. 10.8) здійснюється формування списку таблиць бази даних, реалізованого у функції Structura_BD().
Вказівка на об'єкт Recordset, в якому буде зберігатися інформація про таблиці БД, оголошена як pTables.
Для того, щоб відібрати потрібні таблиці з даними певної БД, необхідно перевірити тип таблиці. У тому випадку, якщо тип таблиці відповідає "TABLE" - дану таблицю необхідно додати в список m_tab. У нашому випадку при роботі з форматом mdb об'єкт Recordset отримає дані про імена і типи таблиць. У таблиці 10.21 наведена інформація про базу даних otl.mdb, яка повертається в об'єкт Recordset pTables.
З таблиці 2 видно, що в БД otl.mdb мають місце 6 системних таблиць, причому 2 мають тип ACCESS TABLE, 4 - SYSTEM TABLE, одна таблиця з даними otl_tab (TABLE) і один SQL-запит - Запрос2 (тип VIEW).
Таким чином, для нашого випадку в лістбоксі буде виведена тільки одна таблиця otl_tab.
Таблиця 10.21
Структура бази даних otl.mdb
Ім'я таблиці (TABLE_NAME) |
Тип таблиці (TABLE_TYPE) |
MSysAccessObjects |
ACCESS TABLE |
MSysAccessXML |
ACCESS TABLE |
MSysACEs |
SYSTEM TABLE |
MSysObjects |
SYSTEM TABLE |
MSysQueries |
SYSTEM TABLE |
MSysRelationships |
SYSTEM TABLE |
otl_tab |
TABLE |
Запрос2 |
VIEW |
Увага! У даному фрагменті слід звернути на особливість приведення типів класів _bstr_t, _variant_t і класу CString.
1. За рахунок перевантаження операторів можна значення довільного типу привести до типу класу роботи з текстом _bstr_t, після чого можна вивести відповідну текстову інформацію де завгодно. Однією з особливостей є те, що даний клас не перевантажує тип даних int. У зв'язку з цим, якщо яка-небудь функція повертає int, її необхідно спочатку привести до типу даних long, a потім до типу _bstr_t. Аналогічна ситуація відбувається і з класом _variant_t, який також не перевантажує тип даних int.
2. Клас CString дуже добре працює з даними класу _bstr_t. Слід зазначити, що перевантажений оператор класу CString "+=" безпосередньо працює з класом _bstr_t. У тому випадку, якщо змінній класу CString присвоюється змінна класу _bstr_t (знак "="), то необхідно привести змінну типу _bstr_t до (char *), як це показано у відповідному фрагменті.
str = (char *)(_bstr_t)pTables->GetFields()->
GetItem ((_variant_t)"TABLE_TYPE")->GetValue();
Після формування списку таблиць, у списку m_pol виводиться перелік полів з обраної таблиці. З цією метою за допомогою ClassWizard доданий відгук на натискання елемента зі списку вибору таблиць (об'єкт m_tab).
Відгук виглядає наступним чином
ON_LBN_SELCHANGE(IDC_LIST_TAB, OnSelchangeListTab)
Наведемо функцію відгуку на вибір відповідної таблиці зі списку (функція OnSelchangeListTab() (блок 7, рис. 10.8)).
// Виведення полів у лістбокс по заданій таблиці