vc mysql保存图片_VC保存和显示数据库图像(JPG、JPEG)

源代码:下载

c3988021e65119237ffbc51a95a50c2e.png

简述关键代码如下:

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;

}

具体的程序请参考附带的例子,例子里面有详细的注释。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值