帮忙看看这段代码错在哪里!
_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;
}