精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
该练习主要使用ADO技术将大型文本或二进制数据如图片文件存入数据库,从库中读出数据,将图片文件显示出来。
开发平台VC++。代码总数:400行;
开发时间:一天半。
技术难点一:将读取到的数据写入文件Cfile::Write();写完数据后要及时将文件关闭Cfile::Close();这样才能保证将数据完整的写入文件内。
技术难点二:读到数据后将此二进制流数据(即图片文件)显示出来,此处使用开源代码CFreeImage类来实现。
//打开文件
CFile fileimage;
CFileStatus filestatus;
fileimage.Open("Bluehills.jpg",CFile::modeRead);
fileimage.GetStatus(filestatus);
//分配内存
ULONG nBytes=(ULONG)filestatus.m_size;
HGLOBAL hGlobal=GlobalAlloc(GPTR,nBytes);
LPVOID lpData=GlobalLock(hGlobal);
//将文件写入缓冲区
fileimage.Read(lpData,nBytes);
HRESULT hr;
_variant_t varChunk;
long lngOffset = 0;
UCHAR chData;
SAFEARRAY FAR *psa = NULL;
SAFEARRAYBOUND rgsabound[1];
try
{
m_pRecordset->AddNew();
m_pRecordset->Fields->GetItem("username")->Value=_variant_t("Bluehills.jpg");
m_pRecordset->Fields->GetItem("old")->Value=_variant_t((long)28);
//Create a safe array to store the array of BYTES
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = nBytes;
psa = SafeArrayCreate(VT_UI1,1,rgsabound);
while(lngOffset < (long)nBytes)
{
chData = ((UCHAR*)lpData)[lngOffset];
hr = SafeArrayPutElement(psa, &lngOffset, &chData);
if(hr!=S_OK)
return ;
lngOffset++;
}
lngOffset = 0;
//Assign the Safe array to a variant.
varChunk.vt = VT_ARRAY|VT_UI1;
varChunk.parray = psa;
hr =m_pRecordset->Fields->GetItem("photo")->AppendChunk(varChunk);
if(hr!=S_OK)
return ;
m_pRecordset->Update();//Addnew()和编辑后都要进行Update()
}
catch(_com_error &e)
{
CString errormessage;
errormessage.Format("错误信息:%s",e.ErrorMessage());
AfxMessageBox(errormessage);
}
//Free memory
GlobalUnlock(lpData);