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

Void cado6Dlg::OnZapis_Add1()

{

if(pRecordset->GetState()==0)return;

SAFEARRAY * ar_f;

SAFEARRAY * ar_v;

SAFEARRAYBOUND rgsabound[1];

rgsabound[0].lLbound = 0;

rgsabound[0].cElements = 5;

long i,per;

ar_f = SafeArrayCreate(VT_VARIANT, 1, &rgsabound[0]);

ar_v = SafeArrayCreate(VT_VARIANT, 1, &rgsabound[0]);

for(i = 0; i < 5; i++)

SafeArrayPutElement(ar_f, &i, &(_variant_t)i);

i = 0;

per = pRecordset->GetRecordCount ();

SafeArrayPutElement(ar_v, &i, &(_variant_t)per);

i++;

per += 100;

SafeArrayPutElement(ar_v, &i, &(_variant_t)per);

i++;

SafeArrayPutElement(ar_v, &i, &(_variant_t)"aaaa");

i++; // Дата

COleDateTime mytime(2000,1,1,0,0,0);

SafeArrayPutElement(ar_v, &i, &(_variant_t)mytime);

i++; // Логіка

per = 0;

SafeArrayPutElement(ar_v, &i, &(_variant_t)per);

_variant_t fields,values;

values.vt = VT_ARRAY|VT_VARIANT;

fields.vt = VT_ARRAY|VT_VARIANT;

fields.parray = ar_f;

values.parray = ar_v;

try

{

pRecordset->AddNew(fields,values);

}

catch(_com_error &ce)

{

Doc->ErrMessage(ce);

}

}

У даному фрагменті використовується метод додавання нового запису AddNew() з параметрами індексів і значень полів. Із цією метою оголошуються дві вказівки для роботи з динамічними масивами структури SAFEARRAY. Це вказівка ar_f для роботи з індексами полів, і ar_v для роботи зі значеннями полів. Для створення об'єкта динамічного масиву використовується функція SafeArrayCreate() у яку передається 3 параметри: тип масиву; його розмірність; адреса на структуру SAFEARRAYBOUND. У структурі SAFEARRAYBOUND вказується початковий індекс масиву (long Lbound) і кількість елементів масиву (long cElements). Структура SAFEAARAY є універсальною для роботи з динамічними масивами різних розмірностей. У нашому випадку масиви є одномірними, тому об'єкт структури SAFEARRAYBOUND оголошений як rgsabound[1]. Причому початковому індексу привласнене значення 0, а кількості елементів – 5 (кількість полів таблиці otl_tab). У функцію SafeArrayCreate() передається значення VT_VARIANT, тобто елементи масивів будуть типу VARIANT. Це дозволяє працювати з різнотипними значеннями, які можуть мати місце в таблиці otl_tab.

Запис у конкретний елемент масиву здійснюється за допомогою функції SafeArrayPutElement(). Вхідними параметрами в цю функцію є адреса на об'єкт масиву SAFEARRAY, індекс елемента масиву і його значення. Так, масив ar_f буде містити значення індексів полів, тому запис у нього відбувається в циклі.

for(i = 0; i < 5; i++)

SafeArrayPutElement(ar_f, &i, &(_variant_t)i);

Тут змінна i використовується як індекс та як значення елемента масиву. Так як масив має тип даних VARIANT, змінну i потрібно привести до класу (_variant_t) і передати як третій параметр.

На наступному етапі кожному елементу масиву ar_v (масив значень полів) привласнюється значення, що відповідає конкретному полю. Так, першим двом полям id та kod, які мають цілий тип даних, привласнюється відповідно, кількість записів (поле id) і кількість записів + 100 (поле kod). Третьому полю (Name) привласнюється текстове значення "aaaa", четвертому (vrem) – значення дати, а п'ятому (log) – логічне значення – 0.

Всі додані значення елементів масиву приводяться до типу _variant_t. Для роботи з датою тут використовується клас COleDataTime, у конструкторі якого встановлюється певна дата. У нашому випадку встановлюється рік (2000), місяць (1), день (1), години (0), хвилини (0), секунди (0). Потім об'єкт mytime класу COleDataTime також приводиться до типу _variant_t.

На наступному етапі необхідно змінним типу _variant_t привласнити значення відповідних масивів.

Увага!!! Якщо робота здійснюється з масивами даних або з вказівками на об'єкти змінної типу _variant_t, то необхідно вказати тип даних, з яким вона повинна працювати (параметр vt). Вказувати тип даних не потрібно при роботі зі змінними, тому що в класі _variant_t добре організоване перевантаження змінних, тобто в цьому випадку будь-яку змінну можна привести до типу _variant_t, крім типу даних (int). При роботі з типом даних int, змінну цього типу потрібно привести до long, а потім до _variant_t.

У нашому випадку параметру vt змінних values та fields класу _variant_t привласнюється значення VT_ARRAY|VT_VARIANT (масив варіантів), а параметру parray відповідні змінні-вказівки на класи SAFEARRAY. На останньому етапі викликається функція AddNew(), входом у яку є дві змінні типу _variant_t, в яких знаходяться індекси та значення полів, реалізовані з використанням динамічних масивів.

Другий варіант додавання запису (функція відгуку OnZapisAdd2() по кнопці <Добавление 2>) є доцільним і містить у собі два етапи. На першому етапі за допомогою методу AddNew() без параметрів створюється порожній запис і стає поточним. На другому етапі полям цього запису (властивість Value об'єкта Recordset) привласнюються відповідні значення, а наприкінці його необхідно оновити, використовуючи метод Update() без параметрів.

Приведемо текст програми функції відгуку OnZapisAdd2().

// кнопка <Добавление2>

// Додавання записів у таблицю otl_tab

// з використанням доступу до полів об'єкта

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