- •О.С. Зеленський
- •Розділ 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.12. Використання у якості джерела даних електронної таблиці Excel
Приклад роботи з MS Excel в якості джерела даних знаходиться у папці DISK\ADO\ADO_EXCEL.
Створимо однодокументний SDI додаток з назвою ADO_Excel для підключення до файлу електронної таблиці MS Excel. Цей додаток багато в чому схожий на ADO_NACH, який було розглянуто у п. 10.10 посібника. В клас документа внесемо наступні змінні:
class COtDoc : public CDocument
{
.............................................................
public:
_ConnectionPtr pConn;
_RecordsetPtr pRecordset;
FieldsPtr fields;
.............................................................
};
Об’єкт pConn типу _ConnectionPtr потрібен для створення з’єднання з файлом БД (або електронної таблиці). Об’єкт pRecordset типу _RecordsetPtr потрібен для створення набору даних (таблиці).
У конструкторі класу напишемо наступний код:
COtDoc::COtDoc()
{
CoInitialize(NULL); // ініциалізація COM и ADO
pConn = 0;
pRecordset = 0;
if(pConn.CreateInstance("ADODB.Connection"))
{
pConn = 0;
MessageBox(0,"Не выполнена инициализация Connection","Внимание!!!",MB_ICONINFORMATION);
return;
}
if(pRecordset.CreateInstance("ADODB.RecordSet"))
{
MessageBox(0,"Не выполнена инициализация Recordset","Внимание!!!",MB_ICONINFORMATION);
pConn.Release();
pConn = 0;
pRecordset = 0;
}
}
Як видно із коду конструктора відбувається створення об’єктів pConn та pRecordset за допомогою функції CreateInstance.
Створимо у додатку діалогове вікно Dialog_gr через яке будемо відкривати та переглядати дані із файлу електронної таблиці. Відкриття файлу електронної таблиці буде відбуватись у функції OnXLS:
void Dialog_gr::OnXLS()
{
if(pConn->GetState())pConn->Close();
if(pRecordset->GetState())pRecordset->Close();
CFileDialog OpenDialog(true, "", "",
OFN_FILEMUSTEXIST |OFN_HIDEREADONLY,
"Microsoft Excel (*.xls)|*.xls|");
if (OpenDialog.DoModal()!=IDOK) return;
str_con="Provider=Microsoft.Jet.OLEDB.4.0; Extended Properties='Excel 8.0;HDR=No'; Data Source=";
str_con+=OpenDialog.GetPathName();
m_zapr.SetWindowText("select * from [list$]");
try
{
Connect_Baza(str_con);
}
catch(_com_error &ce)
{
ErrMessage(ce);
if(pConn->GetState())pConn->Close();
return;
}
MessageBox(pConn->GetConnectionString(),
"Полная строка подключения",MB_ICONINFORMATION);
}
У функції OnXLS відбуваються такі дії: виклик діалогового вікна для вибору файлу (об’єкт OpenDialog типу CFileDialog), заповнення текстового рядку str_con (який потрібен для ініціалізації об’єкту pConn), виклик функції Connect_Baza, виведення повідомлення із текстом рядку для підключення файлу електронної таблиці (рис. 10.11).
Рис. 10.11. Текст рядку підключення до файлу електронної таблиці
Функція Connect_Baza має наступний вигляд:
void Dialog_gr::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-запити для отримання набору даних та виведення їх у елемент керування CDataGrid. При натисненні кнопки «Запрос» у вікні діалогу викликається функція OnZapros, яка формує набір даних на основі запиту введеного у текстове поле:
void Dialog_gr::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 Dialog_gr::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.
Результат роботи програми приведено на рис. 10.12:
Рис. 10.12. Діалогове вікно з відкритим файлом електронної таблиці
Файл електронної таблиці «ot.xls», відкритий у програмі MS Excel, який є джерелом даних, приведено на рис. 10.13:
Рис. 10.13. Файл електронної таблиці «ot.xls»