读取数据库blob字段的问题

kanghuaxing 2005-07-20 11:39:20
代码如下:
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多个字节,不知道是为什么?
望高手指点!!!
...全文
294 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
kanghuaxing 2005-08-02
  • 打赏
  • 举报
回复
估计是myodbc的问题,我用mysql的c api把代码重写了一遍就没有问题了
liumanman521 2005-07-28
  • 打赏
  • 举报
回复
我遇到过这个问题,加我QQ11485884
kanghuaxing 2005-07-28
  • 打赏
  • 举报
回复
1。我又进行了一下尝试,这些出问题的记录发现这些出问题的记录的blob域的field-〉ActualSize的值和我通过mysql客户端工具看到的该字段的长度不一样,field-〉ActualSize却和最终能取出的数据长度一致,也是被截断了的,一般只有几个字节到几十个字节之间。
2。我用getchunk()从结果集的blob字段中取数据被catch到_com_error,hresult为-2146825069,我查了msdn,上边说是adErrIllegalOperation,描述是Operation is not allowed in this context.,但是我检查了代码始终没有发现为什么会出错,该代码以前似乎是正常的。
blobdata = m_pQueryRecordset->Fields->GetItem(fieldname)->GetChunk(bloblen);
其中blobdata为_variant_t的对象,bloblen为我用客户端工具看到的该blob字段的长度,fieldname为该blob字段的字段名,我检查了该字段名没有错。实在是很费解为什么getchunk()会出错,我换成blobdata = m_pQueryRecordset->Fields->GetItem(fieldname)->Value;就没有问题,只是取出的数据的长度和ActualSize一致,比实际长度小很多。
对于这些读取有问题的blob字段,我用DefinedSize取得的长度和真实长度一样,但是ActualSize却很小,只有几k,我怀疑是myodbc检查blob长度的bug。
liumanman521 2005-07-28
  • 打赏
  • 举报
回复
。。。。。。
kanghuaxing 2005-07-27
  • 打赏
  • 举报
回复
问题在描述详细一点。我用的数据库是mysql,内有一个表,表的一个字段时blob类型,用来存数据流的,我采用上述方法读该blob字段时,发现有的记录的blob字段读取是正常的(即用SafeArrayGetUBound取得上界和数据的长度吻合,对比数据也一致),但是有些记录读取出来却被截断了(实际只读取了几个最多几十个字符)。据我的分析,是否截断和数据的长度没有关系,因为我试过40多k的数据能正常读出,而有一条20多k的记录只读出了8个字节,我怀疑和数据的类型有关,我做过一下尝试,在blob中装载txt文件,从几k靠几十k试过多次,都能读成功。装载xls电子表格文件,试过两个20多k的都不能读成功,都只能读几个字节,对比发现都是在0x00的地方截断,但是我又发现在许多能读成功的记录中,含有0x00,但没有被截断。
难道这是mysql或者他odbc的一个bug??
附:我用的mysql版本是4.0.21 for win,odbc驱动是myodbc-2.51.11-2-win
kanghuaxing 2005-07-24
  • 打赏
  • 举报
回复
我真的好失望
kanghuaxing 2005-07-21
  • 打赏
  • 举报
回复
难道没有人知道吗?

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧