Jag är inte bekant med ODBC-programmering, men vid första anblicken är ett problem jag kan se att du antar att din datalängd är flera av din buffertstorlek. Men den senaste läsningen är inte garanterad att returnera exakt 500 byte data.
Du borde skriva något sådant. Kanske:
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;
Vänligen ägna några minuter åt att granska Using Length /Indikatorvärden för att kontrollera hur längd/indikatorvärde används.