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

Void cAdo6Dlg::OnValues_Fields()

{

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

int kol_zap = pRecordset->GetRecordCount ();

if (!kol_zap)

{

MessageBox("Пустая таблица!!!","Внимание!!!",

MB_ICONINFORMATION);

return;

}

try

{

// ------------------ Виведення полів ---------------------

long i;

_bstr_t zn;

_variant_t pol,vr;

pol = (long)0;

CString str="";

char buf[100];

for(i=0;i<fields->GetCount();i++)

{

vr = fields->GetItem((_variant_t)i)->GetValue();

zn = "NULL";

if (vr.vt!= VT_NULL) zn = vr;

str+= zn;

str+=" ";

}

MessageBox(str);

// Кінець виведення полів

// Обчислювальні операції по першому поточному запису

int d1,d2;

pol = (long)0;

pRecordset->MoveFirst();

vr = fields->GetItem(pol)->GetValue();

d1 = 0;

if (vr.vt!= VT_NULL) d1 = vr.iVal ;

pol = (long)1;

vr = fields->GetItem(pol)->GetValue();

zn = "0";

if (vr.vt!= VT_NULL) zn = vr ;

d2 = d1 + atoi(zn);

sprintf(buf,"Сумма первых двух полей = %d",d2);

MessageBox(buf);

// Обчислення середнього арифметичного - Варіант 1

m_datagrid1.SetRefDataSource(0);// Відв’язка від datagrid

double sum = 0;

int kol = 0;

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

{

vr = fields->GetItem(pol)->GetValue();

if (vr.vt!= VT_NULL){kol++;sum+= vr.iVal ;}

pRecordset->MoveNext();

}

if(kol)sprintf(buf," Среднее арифметическое = %f %d ",

sum/kol, kol);

else sprintf(buf,"Данные по полю kod не заполнены");

MessageBox(buf);

// --------------------------------------------------------

// Обчислення середнього арифметичного - Варіант 2

// --------------------------------------------------------

sum = 0;

kol = 0;

pRecordset->MoveFirst();

while(!pRecordset->ADO_EOF)

{

vr = fields->GetItem(pol)->GetValue();

if (vr.vt!= VT_NULL){kol++;sum+= vr.iVal ;}

pRecordset->MoveNext();

}

if(kol)sprintf(buf," Среднее арифметическое = %f %d ",

sum/kol, kol);

else sprintf(buf,"Данные по полю kod не заполнены");

pRecordset->MoveFirst();

// Прив'язка до datagrid

m_datagrid1.SetRefDataSource(pRecordset);

MessageBox(buf);

// ---------------------------------------------------

// РОБОТА З DATE

//---------------------------------------------------

// ПЕРЕТВОРЕННЯ з рядка ASCII в UNICODE і навпаки

// -------------------------------------------------

char pp[] ="ABCD"; // 1 байт на символ

_bstr_t ww = pp;

BSTR tt = ww.copy(); // 2 байти на символ

char* hh = (char*)tt; // псується рядок

LPSTR j = (char*)ww; // рядок стискується - символ 1 байт

sprintf(buf," -і %c -і %c -і %c -і %c",

hh[0],hh[2],hh[4],hh[6]);

MessageBox(buf);

// ----------------------------------------------------

}

catch(_com_error &ce)

{

Doc->ErrMessage(ce);

}

}

Спочатку у функції відгуку, у змінну str типу CString записуються дані всіх полів поточного запису за допомогою змінної zn класу _bstr_t, що привласнюється значення відповідного поля, що має тип _variant_t.

Увага!!! Варто звернути увагу на контроль порожніх значень полів у наборі Recordset. Так, при зчитуванні даних з полів таблиці БД, необхідно здійснити перевірку типу даних змінної варіант (_variant_t.) на VT_NULL. І тільки в тому випадку, якщо значення типу _variant_t (параметр vt) не дорівнює VT_NULL, можна робити з полем різні операції, інакше поле має порожнє значення, і можуть виникати помилки, наприклад, при виконанні розрахункових операцій із числовими даними.

На другому етапі складаються значення двох цілих полів, відповідно id та kod. Значення поля id повертається через змінну ival, що входить в об'єднану структуру VARIANT, а значення поля kod приводиться до змінного класу _bstr_t, для одержання цілого значення якої використовується функція atoi().

На наступному етапі обчислюється середнє арифметичне значення поля id. У цьому випадку використовуються два варіанти проходу по набору Recordset. У першому випадку у якості межі використовується кількість записів (метод GetRecordCount()), у другому – контролюється змінна кінця набору записів ADO_EOF. На початку цього етапу здійснюється відв’язка об'єкта Recordset від Datagrid, а наприкінці – прив'язка. Причому, при підрахунку середнього арифметичного порожні записи в таблиці ігноруються. У цьому зв'язку розраховується сума й кількість для тих записів, які не мають нульове значення по полю id (параметр vt відмінний від VT_NULL).

В даному фрагменті становить особливий інтерес перетворення рядка в кодування Unicode і назад. При використанні кодування Unicode рядкові змінні складаються з 16-розрядних символів (2 байти). Для стандартного кодування Windows вони складаються з 8-розрядних символів.

Приведемо фрагмент тексту програми перекладу в кодування Unicode і назад:

.........................................................................................................

char pp[] ="ABCD"; // 1 байт на символ

_bstr_t ww = pp;

BSTR tt = ww.copy(); // 2 байти на символ

char* hh = (char*)tt; // псується рядок

LPSTR j = (char*)ww; // рядок стискується - символ 1 байт

.........................................................................................................

Слід зазначити, що класи COM-об'єктів, такі як _variant_t, _bstr_t працюють із кодуванням Unicode. Для перетворення звичайного рядка типу (char*) до 16-розрядного кодування, необхідно створити об'єкт класу _bstr_t і привласнити його вихідному рядку. У даному фрагменті об'єкту ww типу _bstr_t привласнюється рядок "ABCD". Якщо привести це рядок до (char*) – він стиснеться, і буде мати місце 8-розрядне кодування (це зроблено за рахунок перевантаження операторів класу _bstr_t). Якщо ж використати об'єкт tt стандартної структури BSTR (метод copy() класу _bstr_t), то при приведенні його до (char*) рядок буде займати 2 байти (16-розрядне кодування Unicode). За допомогою реалізації даного механізму можна встановити кодування, що цікавить користувача, – стандартне або Unicode.

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