Не съм запознат с 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 /Стойности на индикатора за да проверите как дължината/стойността на индикатора се използва.