2014-12-24 3 views
0

Я пытаюсь получить изображение, которое хранится в BLOB, а затем сохранит его как jpg.Как получить данные BLOB с помощью oracle ODBC

Здесь я получаю двоичные данные и сохраняю их в str;

string str; 
    SQLCHAR buf[500] = {0}; 
    while ((SQL_SUCCEEDED(SQLGetData(StmtHandle, colnum, SQL_C_BINARY, buf, sizeof(buf), NULL)))) 
    { 
    string data(reinterpret_cast< const char* >(buf), reinterpret_cast< const char* >(buf) + sizeof(buf)); 
    str = str + data; 
    } 

Тогда я записать его в файл

ofstream file; 
file.open("C:\\Users\\tom\\Desktop\\img.jpeg"); 
file << str; 
file.close(); 

и я получаю неправильный образ.

Что случилось с этим методом извлечения данных (я использовал this)?

+0

_ "и я получаю неправильное изображение." _ Это не изображение, которое вы ожидали? Или файл изображения поврежден? –

+0

файл изображения поврежден, я не могу его открыть, а двоичные данные этого созданного вручную файла отличаются от исходных двоичных данных. – Infated

ответ

0

Я не знаком с программированием ODBC, но на первый взгляд, одна проблема, которую я вижу, заключается в том, что вы предполагаете, что длина ваших данных кратная размеру вашего буфера. Но последнее прочтение не гарантировано возвращает точно 500 байтов данных.

Вы должны написать что-то подобное. Может быть:

string str; 
    SQLCHAR buf[500]; 
    SQLLEN cbLeft;  // #bytes remained 

    while ((SQL_SUCCEEDED(SQLGetData(StmtHandle, 
            colnum, 
            SQL_C_BINARY, 
            buf, 
            sizeof(buf), 
            &cbLeft)))) 
    //        ^^^^^^^ 
    { 
      string data(reinterpret_cast< const char* >(buf), 
         reinterpret_cast< const char* >(buf) 
         + cbLeft); 
      //   ^^^^^^ 
      str = str + data; 

Пожалуйста, потратьте несколько минут, чтобы рассмотреть Using Length/Indicator Values, чтобы проверить, как значение длина/индикатор используется.

+0

thx, я проверил его и теперь использую значение длины/индикатора, но моя проблема все еще не решена. – Infated

+0

@Infated Возможно пришло время сравнить [hexdump] (http://en.wikipedia.org/wiki/Hex_dump) ваш файл данных и ожидаемый контент, чтобы определить проблему (неправильный размер? неверные данные? missing bytes? extra bytes?. ..) –

Смежные вопросы