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


«January 2026»
123
45678910
11121314151617
18192021222324
25262728293031


公告
暂无公告...

我的分类(专题)

日志更新

最新评论

留言板

链接


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




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

joinclear 发表于 2006/5/13 18:06:09

转载自: http://www.vclife.net/articles/article_view.asp?atlid=17 简述关键代码如下: 1、保存图片数据到数据库 //BMP图片保存到数据库    try    {        _RecordsetPtr    pRecordset;        pRecordset.CreateInstance(__uuidof(Recordset));        pRecordset->Open("SELECT * FROM bmp",_variant_t((IDispatch*)pConnection),adOpenStatic,adLockOptimistic,adCmdText);        pRecordset->AddNew();        pRecordset->Fields->Item["bmpid"]->Value = (_variant_t)m_BMPId;        //bmpid        VARIANT pvList;        SetPictureToVariant(pvList,(unsigned char *)m_pBMPBuffer);        pRecordset->Fields->Item["bmpimage"]->AppendChunk(pvList);            //BMP图像文件        VariantClear(&pvList);            pRecordset->Update();        pRecordset->Close();        AfxMessageBox("BMP图像保存成功!");    }    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、从数据库读取图像文件并且显示在界面     //从数据库里取BMP图像文件    try    {        _RecordsetPtr    pRecordset;        char sSql[129];        sprintf(sSql,"SELECT *FROM bmp WHERE bmpid='%s'",m_BMPId);        pRecordset.CreateInstance(__uuidof(Recordset));        pRecordset->Open(sSql,_variant_t((IDispatch*)pConnection),adOpenStatic,adLockOptimistic,adCmdText);        if (pRecordset->adoEOF)        {            CString str;            str.Format("没有BMPid为: %s 的BMP图像!",m_BMPId );            AfxMessageBox(str);            DestroyPhoto();            Invalidate();            m_BMPId = "";            UpdateData(false);            m_EidtBMPId.SetFocus();            return;        }        _variant_t pvList ;                long lDataSize = pRecordset->GetFields()->GetItem("bmpimage")->ActualSize;        m_nFileLen = (DWORD)lDataSize;        if(lDataSize > 0)        {            _variant_t            varBLOB;            varBLOB = pRecordset->GetFields()->GetItem("bmpimage")->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);                                    SafeArrayUnaccessData (varBLOB.parray);                    m_nFileLen = lDataSize;                    m_hBitmap = BufferToHBITMAP();                    Invalidate();//在界面显示                                 }            }        }            }    catch(...)    {        AfxMessageBox("数据库读取失败");        return;    } 上次写了两篇关于在VC界面显示图片(BMP、JPG)的文章,但是并没有涉及到数据库,所以这次补写了这两篇有关数据库的文章,这两篇文章用的是access的数据库,其它的数据库操作道理是一样的。 具体的程序请参考附带的例子,例子里面有详细的注释。 文章为我原创,更多文章请到我的网站查看(www.vclife.net).


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



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



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

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