帮忙看看这段代码错在哪里!

waitlife 2006-07-12 04:20:29
_bstr_t m_strSQL = _T("SELECT Photo FROM CorpEmp WHERE EmpName='") + v_strEmpName + _T("' AND EmpNamePY='") + v_strEmpNamePY + _T("'");
try
  {
    // 使用ADO创建数据库记录集
    ado.m_pRecordset.CreateInstance(__uuidof(Recordset));
    ado.m_pRecordset->Open((_variant_t)m_strSQL, _variant_t((IDispatch*)ado.m_pConnection, true), adOpenStatic, adLockOptimistic, adCmdText);
    // 判断记录是否为空
    if(!ado.m_pRecordset->adoBOF && !ado.m_pRecordset->adoEOF)
    {
      // 如果不为空,则检查 Photo 是否为空
      lDataSize = ado.m_pRecordset->GetFields()->GetItem("Photo")->ActualSize;
      if(lDataSize > 0)
      {
        // 需要绘图
        pStm.CreateInstance(_T("ADODB.Stream"));
        variant_t varOptional(DISP_E_PARAMNOTFOUND, VT_ERROR);
        pStm->PutType(adTypeBinary);// 类型为二进制
        // 得到字段内容的大小
        // m_pRecordset为一个打开的纪录集对象,含有Photo这个blob字段
        pStm->Open( varOptional, adModeUnknown, adOpenStreamUnspecified, _bstr_t(), _bstr_t());
        // 打开 pStm
        pStm->Write(_variant_t(ado.m_pRecordset->GetFields()->GetItem(_T("Photo"))->Value));
        varBLOB = pStm->Read(adReadAll);
        // 把 Photo 字段的内容写入pStm
        pStm->SaveToFile(_T("pub.jpg"), adSaveCreateOverWrite);// 不知道为什么,这行代码不能去掉,否则 pStm 不正常
        // 以下代码用于作图
        HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, pStm->GetSize());
        LPVOID pvData = NULL;
        if (hGlobal != NULL)
        {
          if ((pvData = GlobalLock(hGlobal)) != NULL)
          {
            char * m_pBMPBuffer = new char[pStm->GetSize()+1];//分配必要的存储空间
            char *pBuf = NULL;
            SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
            memcpy(pvData,pBuf,pStm->GetSize()); // 每次执行到这里出错,提示访问内存冲突            SafeArrayUnaccessData (varBLOB.parray);
            GlobalUnlock(hGlobal);
          }
          c_EmpPhoto.Load(hGlobal, pStm->GetSize());
          GlobalFree(hGlobal);
          c_EmpPhoto.Draw();
          Invalidate();
          // 作图完成
        }
      }
    }
    if(ado.m_pRecordset != NULL)
      ado.m_pRecordset->Close();
  }
// 捕捉异常
catch (_com_error e)
{
#ifdef _DEBUG
  CATCH_ERROR;
#endif
#ifdef _RELEASE
  AfxMessageBox(e.Description());
#endif
  return FALSE;
}
...全文
159 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
mynamelj 2006-07-12
  • 打赏
  • 举报
回复
....

int nSize = m_pRecordset->Fields->GetItem("Content")->ActualSize;
varBLOB = ado.m_pRecordset->GetFields()->GetItem("Content")->GetChunk(nSize);


BYTE *pBuf = (BYTE*)GlobalAlloc(GMEM_FIXED,nSize);
SafeArrayAccessData(varBLOB.parray,(void HUGEP**)&pBuf);
LPSTR buffer = (LPSTR)GlobalLock((HGLOBAL)pBuf);

c_EmpPhoto.Load(buffer, nSize);

GlobalUnlock((HGLOBAL)pBuf);
SafeArrayUnaccessData(varBLOB.parray);
waitlife 2006-07-12
  • 打赏
  • 举报
回复
对,我写的模块是员工信息的建立和修改,这段代码主要用于读入图片文件至SQL数据库images字段,在编辑员工信息时,如果数据库存在该员工图片,则读数据库图片信息,并显示在对话框上。主要是读写BLOB字段和显示图片问题!
mynamelj 2006-07-12
  • 打赏
  • 举报
回复
你具体实现一个什么样的功能,从数据库下载图片然后保存为文件吗?
waitlife 2006-07-12
  • 打赏
  • 举报
回复
memcpy(pvData, pBuf, pStm->GetSize())这段是有问题的,如果把一段缓冲区的内容复制到内存中,需要先开辟足够大的内存,否则就会出错。
vc_gdi 2006-07-12
  • 打赏
  • 举报
回复
内存紊乱?
没遇到过

分配的空间够不够大?
liu_qi2006 2006-07-12
  • 打赏
  • 举报
回复
偶看不懂 帮顶
waitlife 2006-07-12
  • 打赏
  • 举报
回复
syy64说得对,是开辟内存问题,把一段缓冲区问题用memcpy给pvData,导致出错!
关于这段代码是也是参考网上利用_ISteamPtr接口来写BLOB对象在数据库中的读写的,其中pStm就是_ISteamPtr接口的实例化。这段代码有时正常,有时不正常,其中pStm->SaveToFile(_T("pub.jpg"), adSaveCreateOverWrite);这一句如果去掉就肯定出问题,不知道是什么原因!
syy64 2006-07-12
  • 打赏
  • 举报
回复
是否可能内存紊乱?
mynamelj 2006-07-12
  • 打赏
  • 举报
回复
SELECT Photo FROM CorpEmp WHERE EmpName='sdfsd'

如果是字符值要加单引号

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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