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

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

}

Користувацькі функції відгуків з їх детальним описом будуть надані нижче!

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