Re[3]: Преобразование _variant_t к char и int
От: Кодт Россия  
Дата: 09.10.08 08:15
Оценка:
Здравствуйте, unfer, Вы писали:

U>
U>MasRec[j]->fio_driver = (char)RecPtr->GetFields()->GetItem(L"fio_driver")->Value;
U>

U>fio_driver имеет тип char.

Неважно, какой формальный тип имеет MasRec[j]->fio_driver.
Важно, какой фактический тип имеет элемент "fio_driver", извлекаемый из рекордсета.

U> При пошаговой проходке когда доходит дело до этой строчки, просто напросто перескакивает в конец программы и все, причем программа не подвисает, она просто ничего не выводит (а должна выводить все элементы массива).


То есть, выбрасывает исключение, потому что там нечто, неприводимое к char.

Напиши не в одну строку, а в несколько.
_variant_t value = RecPtr->.....->Value;

char v;
switch(((VARIANT)value).vt)
{
case VT_BSTR: // строка
    v = * (char*) (_bstr_t) value; // ну допустим, что надо взять первый символ этой строки
    break;
case VT_I2: // short
case VT_I4: // long
case VT_UI1: // byte
    v = (char) (int) value; // ну допустим, что надо срезать число до байта
    break;
default: // все остальные типы, включая EMPTY и NULL
    v = '#';
}

MasRec[j]->fio_driver = v;


А когда перестанешь программировать наощупь — то остановись на одном из приведений, и запихни весь код добычи данных из рекордсета в блок try-catch.
Если вылетает исключение — посылай юзера нафиг, ибо вотще кривые кирпичи (базу данных) подсовывать.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.