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

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)).

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

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