- •О.С. Зеленський
- •Розділ 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::show(int kod, int kod_bd)
{
m_datagrid1.ShowWindow(kod);
m_editquery.ShowWindow(kod);
GetDlgItem(IDC_BUTTON_SELECT)->ShowWindow(kod);
GetDlgItem(IDC_BUTTON_MAKE)->ShowWindow(kod);
GetDlgItem(IDC_BUTTON_FILTER)->ShowWindow(kod);
GetDlgItem(IDC_BUTTON_VOZVRAT)->ShowWindow(kod);
GetDlgItem(IDC_BUTTON_DELETE)->ShowWindow(kod);
GetDlgItem(IDC_BUTTON_FIND)->ShowWindow(kod);
GetDlgItem(IDC_BUTTON_FIRST)->ShowWindow(kod);
GetDlgItem(IDC_BUTTON_LAST)->ShowWindow(kod);
GetDlgItem(IDC_BUTTON_LEFT)->ShowWindow(kod);
GetDlgItem(IDC_BUTTON_RIGHT)->ShowWindow(kod);
GetDlgItem(IDC_BUTTON_PGUP)->ShowWindow(kod);
GetDlgItem(IDC_BUTTON_PGDN)->ShowWindow(kod);
GetDlgItem(IDC_BUTTON_BOOKMARK)->ShowWindow(kod);
GetDlgItem(IDC_BUTTON_RECNO)->ShowWindow(kod);
GetDlgItem(IDC_CHECK_SORT)->ShowWindow(kod);
GetDlgItem(IDC_STATIC2)->ShowWindow(kod);
GetDlgItem(IDC_STATIC3)->ShowWindow(kod);
GetDlgItem(IDC_STAT_TAB)->ShowWindow(kod);
GetDlgItem(IDC_STAT_POL)->ShowWindow(kod);
GetDlgItem(IDC_LIST_TAB)->ShowWindow(kod);
GetDlgItem(IDC_LIST_POL)->ShowWindow(kod);
GetDlgItem(IDC_BUTTON_SAVE)->ShowWindow (kod);
if(kod_bd) kod = SW_HIDE;
GetDlgItem(IDC_BUTTON_ADD1)->ShowWindow(kod);
GetDlgItem(IDC_BUTTON_ADD2)->ShowWindow(kod);
GetDlgItem(IDC_BUTTON_UPDATE1)->ShowWindow(kod);
GetDlgItem(IDC_BUTTON_UPDATE2)->ShowWindow(kod);
GetDlgItem(IDC_BUTTON_FIELDS)->ShowWindow(kod);
GetDlgItem(IDC_BUTTON_FORMIRBD)->ShowWindow(kod);
}
// Функція створення об'єкта Recordset (MySQL і ACCESS)
// Вхід str – запит на вибірку
Void cAdo6Dlg::Recordset_Baza(cString str)
{
if (pRecordset) pRecordset->Close();
pRecordset->CursorLocation = adUseClient;
pRecordset->Open((_bstr_t) str, (IUnknown *) pConn,
adOpenDynamic, adLockOptimistic, adCmdText);
fields = pRecordset->GetFields();
// 1-й параметр - текст SQL-запиту
// 2-й параметр - об'єкт Connection або рядок підключення
// 3-й параметр - тип курсора
// 4-й параметр - тип блокування
// 5-й параметр - опція; для SQL-запиту - adCmdText
}
// Користувацькі функції відгуків для MySQL і MS ACCESS
// --- Користувацькі функції відгуків -------------------
.............................................................
// Користувацькі функції відгуків будуть детально
// розглянуті нижче
.............................................................
// Закриття вікна
Void cAdo6Dlg::OnClose()
{
// Відв'язування
m_datagrid1.SetRefDataSource(0);
CDialog::OnClose();
}
На першому етапі за допомогою ClassWizard прив'яжемо об'єкти до елементів управління. Це три об'єкти типу CListBox: m_baza, m_tab, m_pol, призначені відповідно для виведення баз даних (тільки для MySQL) таблиць з бази даних (MySQL та MS ACCESS), а також для отримання списку полів конкретної таблиці (для MySQL, MS ACCESS та XML). Їм відповідають ідентифікатори IDC_LIST_BAZA, IDC_LIST_TAB, IDC_LIST_POL. Текстовому елементу управління IDC_EDIT1 буде відповідати об'єкт m_editquery, і ActiveX-елементу керування IDC_DATAGRID1 буде відповідати об'єкт m_datagrid1 типу CDataGrid. Прив'язка об'єктів до відповідних елементів управління здійснюється за допомогою функції DoDataExchange(CDataExchange* pDX).
У заголовку класу CADO6Dlg оголошені вказівки на два основних об'єкти ADO, з якими буде проводитися робота. Це об'єкти Connection і Recordset, яким відповідають вказівки: pConn типу _ConnectionPtr і pRecordset типу _RecordsetPtr. Крім цього, оголошено вказівку на сімейство полів fields типу FieldsPtr. Перераховані вказівки приймаються з класу документа CADO6Doc і повертаються туди для подальшої роботи (наприклад, виконання розрахункових операцій, виведення графіки в класі виду CADO6View). У класі також містяться рядкові змінні, в яких зберігаються ім'я вибраної БД (baza) і - таблиці (table).
У функції ініціалізації вікна діалогу відбувається прийом параметрів з класу документа з використанням вказівки *Doc. Потім здійснюється перевірка, який тип бази даних обраний (блок 1 алгоритму, рис. 10.8). Якщо обрана база даних MySQL (змінна tip_bd = 2) – формується відповідний рядок підключення, використовуючи драйвер ODBC:
str_con = "Provider = MSDASQL; DRIVER = MySQL ODBC 3.51 Driver;UID=root;SERVER=localhost";
У якості користувача обраний root, в якості сервера – клієнтська машина localhost. Слід зауважити, що для роботи з ODBC треба вказати у якості провайдеру «MSDASQL» – "Provider = MSDASQL". При початковому створенні об’єкту Connection цей провайдер створюється за умовчанням.
При подальшій роботі, використовуючи ім'я поточної БД і таблиці, можна визначити режим вибору бази даних (блок 8, рис. 10.8): Або це БД otl.mdb (MS ACCESS), otl (MySQL), вибравши яку можна повною мірою працювати з таблицею otl_tab; або це довільна БД, при роботі з якою будуть обмежені деякі можливості, а саме додавання, оновлення записів, а також розрахункові операції з таблицею. Таблиця otl_tab створена в якості експериментальної таблиці (баз даних otl.mdb (MS ACCESS) і otl (MySQL)), при роботі з якою розкриваються всі тонкощі і особливості основних об'єктів ADO.
Якщо у якості джерела даних вибрано xml-файл (змінна tip_bd = 3) – формується наступний рядок підключення:
str_con = "Provider = MSPersist";
У функції ініціалізації головного вікна OnInitialUpdate() викликається користувацька функція show() з вхідним параметром SW_HIDE. Слід зазначити, що функція show() може працювати в двох режимах. Якщо вхідним параметром в дану функцію є SW_HIDE, то всі елементи управління будуть приховані. У тому випадку, коли вхідним параметром буде SW_SHOW (параметр за замовчуванням) - всі елементи управління виведуться на екран. Цей режим буде мати місце, коли користувач вибере базу даних otl.mdb (MS ACCESS) або otl (MySQL), а в ній вибере таблицю otl_tab з усіма її полями. У тому випадку, коли обрана база даних і таблиця інші, будуть показані тільки ті елементи управління, які призначені для роботи з довільною БД, відмінною від otl.mdb (MS ACCESS) або otl (MySQL). Також обмежена робота буде у тому разі, коли в таблиці otl_tab вибрані не всі поля. У цьому випадку на екран не виведуться 6 кнопок, які мають місце тільки для роботи з таблицею otl_tab. Це кнопки: <Добавление 1>, <Добавление 2>, <Оновление 1>, <Оновление 2>, <Значение полей>, <Формирование БД>. Визначення повного або неповного режиму роботи з таблицею БД здійснюється в кнопці "Запрос на выборку" по функції відгуку OnZapros_Select(), яка буде розглянута нижче. За допомогою методу SetAllowAddNew() об'єкта m_datagrid1 з параметром 1 в елементі DataGrid додається порожній рядок для введення нового запису з позначкою "*". Це дає можливість додавати нові записи в режимі редагування даних з використанням компонента DataGrid. При роботі з файлом xml, який являє собою набір даних – приховується список з таблицями таблицями даних, а також кнопки <Формирование БД>, <Запрос на выборку>, <Запрос на выполнение>.
Наведемо реалізацію прикладу ADO6 з вибором БД otl.mdb (MS ACCESS) (рис. 10.9):
У цьому режимі передбачена повнофункціональна робота з таблицею otl_tab бази даних otl.mdb.
Другий режим прикладу ADO6 передбачає роботу з довільною БД, при цьому в результаті виконання програми на екрані не будуть з'являтися кнопки, які відповідають за додавання, оновлення даних, значення полів, а також формування БД.
Реалізація даного прикладу з вибором БД, яка відмінна від otl.mdb (MS ACCESS) або otl (MySQL) представлена на рисунку 10.10. У якості бази даних обрана biblio (MySQL).
Слід зазначити, що при роботі з діалогами в MS Visual C++ виникають проблеми з кодуванням. Це пов'язано з різними версіями Windows. У зв'язку з цим доцільно вносити зміни у файл ресурсів окремої програми. Нижче наведемо частину файлу ресурсів ado6.rc.
Рис. 10.9. Результат виконання програми ADO6 з БД otl.mdb (MS ACCESS)
Рис. 10.10. Результат виконання програми ADO6 з базою даних biblio (MySQL)
// Microsoft Developer Studio generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
/ / Russian resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS)
#ifdef _WIN32
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
#pragma code_page (1251)
#endif //_WIN32
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE DISCARDABLE
BEGIN
"Resource.h\0"
END
2 TEXTINCLUDE DISCARDABLE
BEGIN
"#include" "afxres.h" "\r\n"
"\0"
END
3 TEXTINCLUDE DISCARDABLE
BEGIN
"#define _AFX_NO_SPLITTER_RESOURCES\r\n"
"#define _AFX_NO_OLE_RESOURCES\r\n"
"#define _AFX_NO_TRACKER_RESOURCES\r\n"
"#define _AFX_NO_PROPERTY_RESOURCES\r\n"
"\r\n"
"#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n"
"#ifdef _WIN32\r\n"
"LANGUAGE 9, 1\r\n"
"#pragma code_page (1252)\r\n"
"#endif //_WIN32\r\n"
"#include" "res\\adodc6.rc2" " // non-Microsoft Visual C++ edited resources\r\n"
"#include" "afxres.rc" " // Standard components\r\n"
"#include" "afxprint.rc" " // printing/print preview resources\r\n"
"#endif\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Bitmap
//
IDB_BITMAP1 BITMAP DISCARDABLE "res\\bitmap1.bmp"
#endif // Russian resources
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// English (U.S.) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#endif //_WIN32
/////////////////////////////////////////////////////////////////////////////
.............................................................
Підключення файлу ресурсів складається з двох частин, в залежності від версії Windows. Якщо система Windows російськомовна, то підключається російське кодування символів, а в іншому випадку - англійське кодування. Підключення англійського кодування виділено сірим кольором. Саме при підключенні англійського кодування можуть виникати помилки при роботі з російським шрифтом. Для уникнення помилок при різних кодуваннях необхідно замінити два рядки підключення англійського кодування (виділені сірим кольором) на два рядки російського кодування, які виглядають наступним чином:
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
#pragma code_page(1251)
Наступною головною функцією користувача є функція обробки помилок ErrMessage(_com_error & ce), входом до якої є об'єкт COM-класу _com_error. Ця функція виводить детальну інформацію про помилку, що генерується при обробці виключних ситуацій (технологія try ... catch()). [6, 13].
Наведемо приклад обробки виключних ситуацій.
try
{
<Виконання властивостей і методів об'єктів ADO> (наприклад, pConn->Close())
}
catch(_com_error &ce)
{
ErrMessage (ce);
}
Користувацькі функції відгуків з їх детальним описом будуть надані нижче!