CAdoRecordSet adoRecordSet;
//把图片存入数据库 。 Photo 是数据库的列名 m_ImagePath 是图片路径
adoRecordSet.AppendChunk("Photo",LPCTSTR(m_ImagePath));这样为什么存不进去?
//从数据库中读出图片
adoRecordSet.GetChunk("Photo",m_EmployeeBmp);
每次读的时候,m_EmployeeBmp 总是一个空值。
//把图片存入数据库 。 Photo 是数据库的列名 m_ImagePath 是图片路径
adoRecordSet.AppendChunk("Photo",LPCTSTR(m_ImagePath));这样为什么存不进去?
//从数据库中读出图片
adoRecordSet.GetChunk("Photo",m_EmployeeBmp);
每次读的时候,m_EmployeeBmp 总是一个空值。
CFile file;
...........
fileLen = file.GetLength();
char * m_pBMPBuffer =new char[fileLen + 1];
if(!m_pBMPBuffer){
MessageBox("申请堆内存失败","error",MB_OK);
return;
}
file.ReadHuge(m_pBMPBuffer,fileLen); VARIANT varBLOB;
SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound[1];
if(m_pBMPBuffer)
{
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = fileLen;
psa = SafeArrayCreate(VT_UI1, 1, rgsabound);
for (long i = 0; i < (long)fileLen; i++)
SafeArrayPutElement (psa, &i, m_pBMPBuffer++);
varBLOB.vt = VT_ARRAY | VT_UI1;
varBLOB.parray = psa;
Recordset->GetFields()->GetItem("photo")->AppendChunk(varBLOB);
Recordset->Update();
} 上面是存,取的时候
long lDataSize = m_pRecordset->GetFields()->GetItem("photo")->ActualSize;
if(lDataSize > 0)
{
_variant_t varBLOB;
varBLOB = m_pRecordset->GetFields()->GetItem("photo")->
GetChunk(lDataSize);
if(varBLOB.vt == (VT_ARRAY | VT_UI1))
{
if(m_pBMPBuffer = new char[lDataSize+1]) ///重新分配必要的存储空间
{
char *pBuf = NULL;
SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
memcpy(m_pBMPBuffer,pBuf,lDataSize);
///复制数据到缓冲区m_pBMPBuffer
SafeArrayUnaccessData (varBLOB.parray);
}
}
}
你可以取出来还原成bmp文件看看效果
CFile TempFile;
TempFile.Open("G:\\Test.bmp",CFile::modeWrite|CFile::modeCreate);
TempFile.WriteHuge(m_pBMPBuffer,lDataSize);
TempFile.Close();