读取数据库blob字段的问题
代码如下:
hr = SafeArrayGetElement(queryResult.parray,rgIndices,&fields);
if (fields.vt != VT_NULL)
{
char *pbstr;
long lUbound;
//测试用,取上界
hr = SafeArrayGetUBound(fields.parray,1,&lUbound);
if (FAILED(hr))
{
return -1;
}
hr = SafeArrayAccessData(fields.parray, (void**)&pbstr);
if (FAILED(hr))
{
return -1;
}
if (mms->content.length == 0)
{
return -1;
}
mms->content.data = new char[mms->content.length];
if(mms->content.data == NULL)
{
return -1;
}
//将pbstr指向的数据复制到mms->content.data中,该条语句有时会出现暴力访问的错误
memcpy(mms->content.data,pbstr,mms->content.length);
SafeArrayUnaccessData(fields.parray);
}
我是通过ado的recordset的GetRows()方法把查到的结果集存到_variant_t的对象中,然后把blob字段取出到queryResult中,以上代码就是把blob数据从queryResult中复制到一个new出来的空间中,我都判断了new的空间的大小是否正确,是否分配成功,而且对SafeArrayGetUBound和SafeArrayAccessData都判断的hr是否正确,但是到memcpy(mms->content.data,pbstr,mms->content.length);
这行时仍然可能出错(但并不是每次都出错,错误是暴力访问),我分析出错的原因只可能是pbstr指向的数据的长度不足mms->content.length,但是我跟踪时核实了mms->content.length和数据库中blob字段的长度一致,难道是SafeArrayAccessData语句不可靠。
还有一个问题,就是我用SafeArrayGetUBound测得上界是23(没出错时也是这样),也就是只有24个元素,但实际该blob字段有4000多个字节,不知道是为什么?
望高手指点!!!