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

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

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