Я пытаюсь получить изображение, которое хранится в BLOB, а затем сохранит его как jpg.
Здесь я извлекаю двоичные данные и сохраняю их в 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();
и я получаю неправильное изображение.
Что не так с этим методом извлечения данных (я использовал это)?
Я не знаком с программированием 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;
Прочтите несколько минут, чтобы просмотреть значения длины/индикатора, чтобы проверить, как используется значение длины/индикатора.