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

源代码:下载

4042e49cc3c0ec9fe7f36e3f02828156.png

简述关键代码如下:

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的数据库,其它的数据库操作道理是一样的。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值