精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
该练习主要使用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);