- •О.С. Зеленський
- •Розділ 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::OnZapros_Make()
{
struct _timeb timebuffer;
_ftime( &timebuffer );
double nach = timebuffer.time+timebuffer.millitm/1000.0;
CString str,str1;
int kod=0;
m_editquery.GetWindowText (str);
str.TrimLeft();
str.MakeUpper ();
GetDlgItem(IDC_STATIC3)->SetWindowText("");
if (str.Mid(0,3).Compare("SEL")==0)
{MessageBox("Команда SELECT недопустима для данной кнопки");
return;
}
if (str.Mid(0,3).Compare("DEL")==0)
{
str1 = "DELETE FROM <таблица> [ where<условие> ]";
kod = 1;
}
if (str.Mid(0,3).Compare("UPD")==0)
{
str1 = "UPDATE <таблица> SET <поле>=<виражение>, [< поле>= <виражение>]... [where<условие>]";
kod=2;
}
if (str.Mid(0,3).Compare("INS")==0)
{
str1 = "INSERT INTO <таблица> (<список имен полей>) VALUES (<список значений>)";
kod=3;
}
if (str.Mid(0,3).Compare("CRE")==0)
{
str1 = "CREATE TABLE <таблица> (<імя поля1> <тип>, <імя поля2> <тип>... )";
kod=4;
}
if (str.Mid(0,3).Compare("DRO")==0)
{
str1 = "DROP TABLE <таблица>";
kod=5;
}
if(kod)GetDlgItem(IDC_STATIC3)->
SetWindowText("Синтаксис: " + str1);
try
{
pConn->BeginTrans();
pConn->Execute((_bstr_t)str,0, adCmdUnknown);
pConn->CommitTrans();
}
catch (_com_error &ce)
{
pConn->RollbackTrans();
Doc->ErrMessage(ce);
if(kod && str.GetLength()< 15)
m_editquery.SetWindowText (str1);
m_editquery.SetFocus();
return;
}
// Змінити запит на виконання...
if(pRecordset) pRecordset->Requery (-1);//перечитати набір
_ftime (&timebuffer);
double conec = timebuffer.time+timebuffer.millitm/1000.0;
CString vr_zap;
Vr_zap.Format(" Запрос выполнен за %f сек ",conec - nach);
MessageBox(vr_zap);
m_editquery.SetWindowText ("");
GetDlgItem(IDC_STATIC3)->SetWindowText ("");
}
При реалізації функції OnZapros_Make() здійснюється виконання SQL-запитів на зміну. Якщо користувач почав використовувати команду SELECT (перевіряється тільки перші 3 букви) буде виведене повідомлення про неприпустимість використання даної кнопки. У даній функції передбачено виведення синтаксису для певних команд SQL, як у текстове поле, так й у поле напису. У тому випадку, якщо допущено помилку в тексті SQL-запиту, у написі (IDC_STATIC3) буде виведений синтаксис команди. Синтаксис даний на наступні команди SQL: DELETE (запит на видалення), UPDATE (запит на оновлення), INSERT INTO (запит на додавання), CREATE TABLE (запит на створення таблиці), DROP TABLE (запит на видалення таблиці). У тому випадку, якщо користувач помилився й написав у текстовому полі m_editquery текст запиту менше 15 символів – оновиться й напис і текстове поле, якщо написано 15 і більше символів тексту – оновиться тільки напис, де буде видний синтаксис тієї або іншої команди. Це зроблено для того, щоб при допущенні найменшої помилки користувач не перенабирав текст SQL-запиту заново.
У даному фрагменті інтерес представляє робота із транзакціями, що доцільно використовувати при роботі із груповими запитами на зміну даних. Слід зазначити, що транзакція працює тільки в синхронному режимі й контролює виконану операцію. Метод BeginTrans() об'єкта Connection починає роботу із транзакцією, а метод CommitTrans() завершує й здійснює контроль над всіма операціями для даної транзакції. У випадку помилки відбувається відкат транзакції за допомогою методу RollbackTrans().
Після реалізації запиту на виконання необхідно перечитати набір, для того щоб в об'єкті DataGrid відобразилися змінені дані. Набір перечитується за допомогою методу Requery(). Якщо у якості параметру поставити -1, то при повторному відкритті набору збережуться всі установки, наприклад сортування записів.
Слід зазначити, що метод Requery() закриває об'єкт Recordset, видаляє всі його індексні файли й тимчасові настроювання. Після цього набір створюється заново, і якщо як вхідний параметр поставити -1, то сортування записів, фільтрація будуть відбуватися заново.
Увага!!! Особливістю цієї й багатьох інших функцій є контроль її виконання за певний час, з точністю до мілісекунд. Даний підхід реалізований за допомогою класичних функцій дати й часу, а також класичних структур. Експерименти виконання кожної функції за певний час дозволяють проаналізувати роботу методів основних об'єктів ADO й ефективно побудувати свою роботу.
У даному прикладі використовується структура _timeb, що дозволяє деталізувати час із точністю до мілісекунд. Опис даної структури наведено нижче.
struct _timeb
{
long time ; // кількість секунд починаючи з 1970 року
short millitm ; // кількість мілісекунд
// відмінність у хвилинах за Гринвічем та місцевим часом
short _timezone ;
short dstflag ; // відмінний від 0 при денному світлі
};
Функція _ftime() заповнює структуру timebuffer типу _timeb. Потім у змінну nach записується кількість секунд, починаючи з 1970 року з врахуванням мілісекунд, і зчитується відповідна кількість секунд наприкінці виконання функції OnZapros_Make() у змінну conec. Різниця цих змінних і дасть нам кількість секунд на експериментальні операції з врахуванням мілісекунд.