Преобразование _variant_t к char и int
От: unfer  
Дата: 09.10.08 04:38
Оценка:
Здравствуйте все!
Извиняюсь за, возможно, слишком ламерский вопрос.
Итак, есть у меня RecordSet с данными, теперь мне надо эти данные поместить в массив структур, причем количество структур в массиве, как вы понимаете, заранее неизвестно, т.е. как бы динамический массив.
Насколько я понимаю, данные в RecordSet'е хранятся в типе _variant_t, т.е. результатом строчки
RecPtr->GetFields()->GetItem(L"field_name")->Value

будет тип _variant_t.
Далее, есть у меня структура вида
struct RecStr
{
    char np_timep;
    unsigned int id;
    char prod_abbr2;
    char num_otgr;
    short int num_sec;
    unsigned short int vzl_sert;
    unsigned int card_id;
    unsigned short int card_num;
    unsigned short int status;
    char np_data_o;
    char fio_driver;
};

, а также массив таких структур
RecStr **MasRec = new RecStr*[RecNum];     //
    for (int i = 0; i < RecNum; i ++)  //
    {                               //Кстати, правильно ли я делаю?
        MasRec[i] = new RecStr;    //
    }                                  //

Необходимо данные из RecordSet'a записать в этот массив, но пока не получается.
Делаю так
(TCHAR*)(_bstr_t)RecPtr->GetFields()->GetItem(L"id")->Value;

— компилятор ругается, вот так
*(TCHAR*)(_bstr_t)RecPtr->GetFields()->GetItem(L"id")->Value;

— выводит непонятные значения.

Может кто-нибудь в курсе, как нужно делать правильно? Направьте новичка на путь истинный =)
Re: Преобразование _variant_t к char и int
От: unfer  
Дата: 09.10.08 05:57
Оценка:
Есть небольшой прогресс.
Преобразовать из _variant_t в int получилось с помощью простого оператора приведения типов (int). Но вот с char'ом подобное не проходит. Как быть?
Re: Преобразование _variant_t к char и int
От: _Dreamer Россия  
Дата: 09.10.08 06:18
Оценка:
Здравствуйте, unfer, Вы писали:

U>Необходимо данные из RecordSet'a записать в этот массив, но пока не получается.

U>Делаю так
U>
U>(TCHAR*)(_bstr_t)RecPtr->GetFields()->GetItem(L"id")->Value;
U>

U> — компилятор ругается, вот так
U>
U>*(TCHAR*)(_bstr_t)RecPtr->GetFields()->GetItem(L"id")->Value;
U>

U> — выводит непонятные значения.

U>Может кто-нибудь в курсе, как нужно делать правильно? Направьте новичка на путь истинный =)


как именно ругается компилятор?
у _variant_t тьма перегруженных операторов, можно вот так делать —
_variant_t v( "hello" );
_bstr_t str = v;  // "hello"
const char * c_str = (const char*)str; // "hello"
const wchar_t * wc_str = (const wchar_t*)str; // "hello"

_variant_t int_va(0);
int i = (int)int_var;
char c = (char)int_var;
// ну и т.д.


опять же, с массивом — стоит взять std::vector<>, примерно так —
#include <vector>

typedef std::vector< RecStr > records_type;

...
records_type records;

while( ... )
{
  RecStr data;
  // заполняем структуру data

  records.push_back( data );
}


vector сам позаботится о выделении памяти и ее освобождении.
Re[2]: Преобразование _variant_t к char и int
От: unfer  
Дата: 09.10.08 06:56
Оценка:
_D>как именно ругается компилятор?
Точнее сказать не ругается, билдится без ошибок, запускается и... ничего не происходит.
_D>у _variant_t тьма перегруженных операторов, можно вот так делать -
_variant_t int_va(0);
char c = (char)int_var;

Вот так как раз и не получается.
Вот моя строчка
MasRec[j]->fio_driver = (char)RecPtr->GetFields()->GetItem(L"fio_driver")->Value;

fio_driver имеет тип char. При пошаговой проходке когда доходит дело до этой строчки, просто напросто перескакивает в конец программы и все, причем программа не подвисает, она просто ничего не выводит (а должна выводить все элементы массива).
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...
Пока на собственное сообщение не было ответов, его можно удалить.