- •О.С. Зеленський
- •Розділ 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.10. Приклад програмування об'єктів ado
На початку 1990 р. існувало декілька постачальників баз даних, кожен із яких мав власний інтерфейс. Якщо додакту було необхідно використовувати дані із декількох джерел, тоді для взаємодії з кожною із баз даних було необхідно написати свій код. Для вирішення цієї проблеми Microsoft і ряд інших компаній створили стандартний інтерфейс який отримав назву Open Database Connectivity (ODBC), що у перекладі означає відкритий зв'язок із базами даних.
За допомогою ODBC прикладні програмісти можуть розробляти додатки використовуючи єдиний інтерфейс доступу до даних.
Це досягається завдяки тому, що постачальники різних баз даних створюють драйвери, що реалізують конкретне наповнення стандартних функцій з ODBC API з урахуванням особливостей їхнього продукту.
MFC удосконалила ODBC для розробників додатків. Інтерфейс ODBC є звичайним процедурним API. Замість створення простої оболонки процедурного API, розробники MFC створили набір абстрактних класів, що представляють логічні сутності в базі даних.
Для перегляду драйверів ODBC, встановлених у системі відкрийте Панель управления → Администрирование → Источники данных (ODBC) з'явиться вікно діалогу, на якому оберіть вкладку Драйверы:
Рис. 10.1. Вікно з драйверами ODBC, встановленими у системі
Створимо додаток на основі діалогового вікна з назвою ADO_NACH, який зображено на рис. 10.2: (папка DISK\ADO\ADO_NACH)
Рис. 10.2. Діалогове вікно програми ADO_NACH з відкритою базою данних
Відразу після створення отримаємо файли ado_nach.cpp, ado_nachDlg.cpp, StdAfx.cpp та інші. Додаток буде працювати наступним чином: користувач відкриватиме файл з базою данних MS Access, а потім вводити текст SQL запиту для перегляду інформації із БД. Щоб виводити інформацію у вигляді таблиці використаємо елемент керування CDataGrid, який буде знаходитись у діалоговому вікні.
Відкрийте у редакторі ресурсів діалогове вікно. У нових проектах елементу CDataGrid на панелі інструментів не має, щоб вивести його на панель виконайте команду Project → Add To Project → Components and Controls, і відкриється вікно Components and Controls Gallery (рис. 10.3):
Рис. 10.3. Вікно Components and Controls Gallery
Двічі клацніть на рядок Registered ActiveX Controls, щоб вивести список всіх доступних елементів ActiveX. Знайдіть елемент Microsoft DataGrid Control 6.0 (SP6) (OLEDB) та натисніть кнопку Insert, з’явиться вікно Confirm Classes у якому натисніть OK. Після цього на панелі повинна з’явитись іконка з відповідним елементом (рис. 10.4), а в папку з проектом надається можливість додати наступні файли: datagrid.cpp, font.cpp, stddataformatdisp.cpp, picture.cpp, columns.cpp, selbookmarks.cpp, splits.cpp, column.cpp разом із їх заголовочними файлами. Для відображення результатів запитів у елементі керування Datagrid достатньо додати файл datagrid.cpp разом із заголовочним файлом datagrid.h.
Рис. 10.4. Елемент керування Microsoft DataGrid Control 6.0 (SP6) (OLEDB) на панелі інструментів Controls
Створіть у діалоговому вікні елементи керування: текстове поле (IDC_EDIT1), 2 кнопки (IDC_BD, IDC_ZAPROS) та сітку (IDC_DATAGRID1), які були показані на рис. 10.2. Додайте до елементів керування змінні m_grid (типу CDataGrid) і m_zapr (типу CEdit), використовуючи майстер, як показано на рис. 10.5:
Рис. 10.5. Додавання змінних m_grid і m_zapr у клас діалогу
Для підключення баз данних у файлі StdAfx.h допишіть наступні рядки коду:
#include "msado15.tlh"
using namespace ADODB;
Також необхідно додати у папку із проектом файли msado15.tlh і msado15.tli.
Додайте змінні pConn, pRecordset, fields, str_con у клас CAdo_nachDlg:
class CAdo_nachDlg : public CDialog
{
.............................................................
_ConnectionPtr pConn;
_RecordsetPtr pRecordset;
FieldsPtr fields;
CString str_con;
.............................................................
};
Об’єкт pConn типу _ConnectionPtr потрібен для створення з’єднання з файлом БД. Змінна str_con типу CString буде містити рядок підключення до БД. Об’єкт pRecordset типу _RecordsetPtr потрібен для створення набору даних (таблиці).
У конструкторі класу напишемо такий код:
CAdo_nachDlg::CAdo_nachDlg(CWnd* pParent /*=NULL*/)
: CDialog(CAdo_nachDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
CoInitialize(NULL); // ініциалізація COM и ADO
pConn = 0;
pRecordset = 0;
if(pConn.CreateInstance("ADODB.Connection"))
{
pConn = 0;
MessageBox("Не выполнена инициализация Connection","Внимание!!!",MB_ICONINFORMATION);
return;
}
if(pRecordset.CreateInstance("ADODB.RecordSet"))
{
MessageBox("Не выполнена инициализация Recordset","Внимание!!!",MB_ICONINFORMATION);
pConn.Release();
pConn = 0;
pRecordset = 0;
}
}
Як видно із коду конструктора відбувається створення об’єктів pConn та pRecordset за допомогою функції CreateInstance.
Відкриття файлу відбувається у функції OnBd:
void CAdo_nachDlg::OnBd()
{
if(pConn->GetState())pConn->Close();
if(pRecordset->GetState())pRecordset->Close();
CFileDialog OpenDialog(true, "", "",
OFN_FILEMUSTEXIST |OFN_HIDEREADONLY,
"Microsoft Access Database (*.mdb)|*.mdb|");
if (OpenDialog.DoModal()!=IDOK) return;
//Работа с файлом .mdb (ACCESS)
str_con=("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=");
str_con+=OpenDialog.GetPathName();
str_con+=";";
try
{
Connect_Baza(str_con);
}
catch(_com_error &ce)
{
ErrMessage(ce);
if(pConn->GetState())pConn->Close();
return;
}
MessageBox(pConn->GetConnectionString(),"Полная строка подключения",MB_ICONINFORMATION);
}
У функції OnBd відбуваються такі дії: виклик діалогового вікна для вибору файлу (об’єкт OpenDialog типу CFileDialog), заповнення текстового рядку str_con (який потрібен для ініціалізації об’єкту pConn), виклик функції Connect_Baza, виведення повідомлення із текстом рядка для підключення файлу БД (рис. 10.6).
Рис. 10.6. Текст рядка підключення до файлу бази даних
Функція Connect_Baza має наступний вигляд:
void CAdo_nachDlg::Connect_Baza(CString str)
{
pConn->ConnectionTimeout = 15000;
// максимальний час з’єднання в мсек
pConn->CommandTimeout = 15000;
// максимальний час виконня команди в мсек
pConn->Mode=adModeReadWrite;
// режим доступу для читання/запису
pConn->Open((_bstr_t)str,"","",0);
// параметри функції Open:
// 1) – рядок підключення
// 2) – ім’я користувача (UserID)
// 3) - пароль користувача (Password)
// 4) - визначає підключення в синхронному (0)
//або асинхронному режимі
}
У ній встановлюються параметри об’єкта pConn а методом Connection::Open створюється підключеня до файлу БД. Більш детальну інформацію про властивості і методи класу Connection було наведено у таблицях 10.1, 10.2.
Якщо вдалося створити підключення до файлу БД, то ми отримаємо можливість робити SQL-запити для отримання набору даних та виведення їх у елемент керування DataGrid. При натисненні кнопки «Запрос» у вікні діалогу викликається функція OnZapros, яка формує набір даних на основі запиту введеного у текстове поле:
void CAdo_nachDlg::OnZapros()
{
if (!pConn->GetState())return;
if (pRecordset->GetState())pRecordset->Close();
CString str_query;
m_zapr.GetWindowText(str_query);
str_query.MakeUpper();
try
{
// Реалізация SQL - запиту
Recordset_Baza(str_query);
// Прив’язка об’єкта Recordset до Datagrid
m_grid.SetRefDataSource(pRecordset);
}
catch(_com_error &ce)
{
ErrMessage(ce);
if(pRecordset->GetState())pRecordset->Close();
}
}
У функції виконуються такі дії: вводиться текстовий рядок str_query (у якому буде міститись SQL запит), через вказівку на текстове поле m_zapr заповнюємо рядок str_query функцією GetWindowText, через функцію MakeUpper переводимо текст запиту до верхнього регістру (великі букви), викликаємо функцію Recordset_Baza (яка буде наведена далі), встановлюємо результати запиту у елемент m_grid функцією SetRefDataSource. Інструкції try і catch потрібні на випадок не спрацювання SQL запиту.
Функція Recordset_Baza виконує настройки об’єкта pRecordset та створює набір даних:
void CAdo_nachDlg::Recordset_Baza(CString str)
{
pRecordset->CursorLocation = adUseClient;
pRecordset->Open((_bstr_t)str, (IUnknown*)pConn,
adOpenDynamic, adLockOptimistic, adCmdText);
fields = pRecordset->GetFields();
// параметри функції Open:
// 1) - текст SQL-запиту
// 2) - об’єкт Connection або рядок підключення
// 3) - тип курсора
// 4) - тип блокування
// 5) – (для SQL-запиту = adCmdText)
}
Властивості та методи об'єкта Recordset було наведено у таблицях 10.5, 10.6.
Як було сказано вище для виведення таблиці після відкриття бази данних ми вводимо текст SQL запиту. Він може бути різним у залежності від файла БД, який було відкрито. Для прикладу наведемо текст запиту використаний на рис. 10.2:
select god, curs, spec as [Спеціальність], kol as [Кількість], oc_5, oc_4, oc_3, oc_2, n_zav, n_dop as [Не допущені] from rezult