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

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. Різниця цих змінних і дасть нам кількість секунд на експериментальні операції з врахуванням мілісекунд.

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