Nie jestem zaznajomiony z programowaniem ODBC, ale na pierwszy rzut oka widzę, że zakładasz, że długość danych jest wielokrotnością rozmiaru bufora. Nie ma jednak gwarancji, że ostatni odczyt zostanie zwrócony dokładnie 500 bajtów danych.
Powinieneś napisać coś takiego. Może:
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;
Poświęć kilka minut na sprawdzenie Korzystanie z długości /Wartości wskaźnika aby sprawdzić, jak długość/wartość wskaźnika jest używany.