Tôi không quen với lập trình ODBC, nhưng ngay từ cái nhìn đầu tiên, một vấn đề tôi có thể thấy là bạn giả sử độ dài dữ liệu của mình bằng nhiều lần kích thước bộ đệm của bạn. Nhưng bản đọc cuối cùng không được đảm bảo trả lại chính xác 500 byte dữ liệu.
Bạn nên viết một cái gì đó như thế. Có thể:
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;
Vui lòng dành vài phút để xem lại Thời lượng Sử dụng / Giá trị chỉ báo để kiểm tra xem giá trị chiều dài / chỉ số như thế nào được sử dụng.