根据TrollTech的回复,修改函数如下:
static QVariant qGetBinaryData(SQLHANDLE hStmt, int column)
{
QByteArray fieldVal;
SQLSMALLINT colNameLen;
SQLSMALLINT colType;
QSQLULEN colSize;
SQLSMALLINT colScale;
SQLSMALLINT nullable;
QSQLLEN lengthIndicator = 0;
SQLRETURN r = SQL_ERROR;
SQLTCHAR colName[COLNAMESIZE];
r = SQLDescribeCol(hStmt,
column + 1,
colName,
COLNAMESIZE,
&colNameLen,
&colType,
&colSize,
&colScale,
&nullable);
if (r != SQL_SUCCESS)
qWarning("qGetBinaryData: Unable to describe column %d", column);
// SQLDescribeCol may return 0 if size cannot be determined
if (!colSize)
colSize = 255;
else if (colSize > 65536) // read the field in 64 KB chunks
colSize = 65536;
fieldVal.resize(colSize);
ulong read = 0;
while (true) {
r = SQLGetData(hStmt,
column+1,
SQL_C_BINARY,
(SQLPOINTER)(fieldVal.constData() + read),//此处的"-read"改为"+read"
fieldVal.size() - read,
&lengthIndicator);
if (r != SQL_SUCCESS && r != SQL_SUCCESS_WITH_INFO)
break;
if (lengthIndicator == SQL_NULL_DATA)
return QVariant(QVariant::ByteArray);
//if (lengthIndicator == SQL_NO_TOTAL) {
//修改为下面的内容,剩余字节>65536时继续读取,否则读取剩余的字节
if (lengthIndicator >65536) {
read += colSize;
colSize = 65536;
} else {
read += lengthIndicator;
//read += colSize;
}
if (r == SQL_SUCCESS) { // the whole field was read in one chunk
fieldVal.resize(read);
break;
}
fieldVal.resize(fieldVal.size() + colSize);
}
return fieldVal;
}
在opensource版和商业版中运行通过