Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Беда


Автор: Acer 2.11.2008, 20:47
Доброго времени суток.
Подскажите, что я не правильно сделал.
Вопрос в следующем:
есть метод:
Код

bool RODBC::getCellValue(int idx,void *value,long v_size,long *d_size,short cm){
    RETCODE rc;
    if ( cm == 1 ){
        SQLFetch( this->hstmt );
    }
    rc = SQLGetData( this->hstmt, idx, SQL_C_DEFAULT, value, v_size, d_size );
    return rc == SQL_SUCCESS;
}

Если я внутри этого метода вывожу в консоль value, то значение есть все время.
Если вызываю метод из вне, то значение есть через раз.
Вызываю так:
Код

for ( int j = 0; j < 4; j++ ){
    rdbc.execQuery( "SELECT atm FROM atm_data WHERE bank='2'" );
    char atm[10];
    long ds;
    rdbc.getCellValue( 1, atm, 10, &ds, 1 );
    std::cout << atm << std::endl;
}

Вот скриншоты, чтобы было понятнее...
Это, когда вывожу value внутри метода getCellValue
user posted image
Это когда не в нем
user posted image

Автор: Acer 3.11.2008, 14:51
Help please

Автор: J0ker 3.11.2008, 18:14
внутри функции эта переменная является указателем - и выводится она как указатель
снаружи она объявлена как массив символов и передается на вывод как char* - т.е. строка. Если первый байт массива ==0, то естественно это конец строки

Автор: Acer 3.11.2008, 19:46
логично... Но почему указатели есть везде, а вот строки через одну?  smile 

Автор: J0ker 3.11.2008, 20:27
строки тоже везде есть
только некоторые пустые - т.е. первый символ (индекс 0) содержит конец строки '\0'
как я вижу вы передаете указатель на буфер в какую-то функцию, которая вероятно должна заполнить буфер строкой. Вероятно строка эта пустая.

Автор: Acer 3.11.2008, 20:33
Значит бок не с указателями, а с SQL API... Где-то что-то недосмотрел. Спасибо

Автор: J0ker 3.11.2008, 20:52
посмотрите поведение SQLGetData в случае недостаточного размера буфера
может быть вариант, что если буфер слишком мал, то даже при наличии "чего вернуть" данная функция возвращает пустую строку
для таких вещей я бы рекомендовал проверить, какой максимальный размер для данного типа отводится в БД - обычно эти размеры выводят в библиотеках в виде констант или дефайнов - и используйте буфер размером максимальный_размер+1 (+1 - для символа конца строки)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)