本站首页    管理页面    写新日志    退出


«January 2026»
123
45678910
11121314151617
18192021222324
25262728293031


公告
暂无公告...

我的分类(专题)

日志更新

最新评论

留言板

链接


Blog信息
blog名称:
日志总数:21
评论数量:94
留言数量:1
访问次数:145865
建立时间:2006年1月9日




[Visual C++](二)VC保存和显示数据库图像(JPG、JPEG)
原创空间,  文章收藏,  软件技术

joinclear 发表于 2006/5/13 18:08:13

转载自: http://www.vclife.net/articles/article_view.asp?atlid=18 简述关键代码如下: 1、保存图片数据到数据库     //JPG图片保存到数据库    try    {        _RecordsetPtr    pRecordset;        pRecordset.CreateInstance(__uuidof(Recordset));        pRecordset->Open("SELECT * FROM jpg",_variant_t((IDispatch*)pConnection),adOpenStatic,adLockOptimistic,adCmdText);        pRecordset->AddNew();        pRecordset->Fields->Item["jpgid"]->Value = (_variant_t)m_JPGId;//jpgid        VARIANT pvList;        SetPictureToVariant(pvList,(unsigned char *)m_pJPGBuffer);        pRecordset->Fields->Item["jpgimage"]->AppendChunk(pvList); //JPG图像文件        VariantClear(&pvList);                pRecordset->Update();        pRecordset->Close();        AfxMessageBox("JPG图像保存成功!");         m_JPGId == "";        UpdateData(false);    }    catch(...)    {        AfxMessageBox("数据库读取失败");        return;    }其中SetPictureToVariant如下:    void CBMPinDBDlg::SetPictureToVariant(VARIANT &pvList, unsigned char *sPicture)    {        SAFEARRAYBOUND saBound[1];        saBound[0].cElements = m_nFileLen;        saBound[0].lLbound = 0;        SAFEARRAY *pSA = SafeArrayCreate(VT_UI1, 1, saBound);            for (long l = 0; l < (long)m_nFileLen; l ++)        {            SafeArrayPutElement( pSA, &l, (void*)&sPicture[l]);                }        VariantClear(&pvList);        pvList.vt = VT_UI1 | VT_ARRAY;        pvList.parray = pSA;    } 2、从数据库读取图像文件并且显示在界面     //从数据库里取JPG图像文件    try    {        _RecordsetPtr    pRecordset;        char sSql[129];        sprintf(sSql,"SELECT *FROM jpg WHERE jpgid='%s'",m_JPGId);        pRecordset.CreateInstance(__uuidof(Recordset));        pRecordset->Open(sSql,_variant_t((IDispatch*)pConnection),adOpenStatic,adLockOptimistic,adCmdText);        if (pRecordset->adoEOF)        {            CString str;            str.Format("没有JPGid为: %s 的JPG图像!",m_JPGId );            AfxMessageBox(str);            Invalidate();            m_JPGId = "";            UpdateData(false);            m_EidtJPGId.SetFocus();            return;        }        _variant_t pvList ;                long lDataSize = pRecordset->GetFields()->GetItem("jpgimage")->ActualSize;        m_nFileLen = (DWORD)lDataSize;        if(lDataSize > 0)        {            _variant_t            varBLOB;            varBLOB = pRecordset->GetFields()->GetItem("jpgimage")->GetChunk(lDataSize);            //把二进制格式的图片转为图片格式            try            {                if(varBLOB.vt == (VT_ARRAY | VT_UI1))                {                    if(m_pJPGBuffer = new char[lDataSize+1])                            {                            char *pBuf = NULL;                        SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);                        memcpy(m_pJPGBuffer,pBuf,lDataSize);                                        SafeArrayUnaccessData (varBLOB.parray);                        m_nFileLen = lDataSize;                                                //m_pJPGBuffer -> pPicture                                            HGLOBAL hMem = ::GlobalAlloc( GMEM_MOVEABLE, m_nFileLen );                        LPVOID lpBuf = ::GlobalLock( hMem );                                            memcpy(lpBuf,m_pJPGBuffer,m_nFileLen);                                                ::GlobalUnlock( hMem );                                                if ( CreateStreamOnHGlobal( hMem, TRUE, &pStream ) !=S_OK )                                 return ;                                                if ( OleLoadPicture( pStream, m_nFileLen, TRUE, IID_IPicture, ( LPVOID * )&pPicture ) !=S_OK )                            return ;                                                Invalidate();//在界面显示                                     }                }            }            catch(...)            {                AfxMessageBox("从数据库中读取jpg图像有错!");                return;            }                    }            }    catch(...)    {        AfxMessageBox("数据库读取失败");        return;    } 具体的程序请参考附带的例子,例子里面有详细的注释。


阅读全文(3104) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.438 second(s), page refreshed 144808020 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号