使用ADO实现vc中二进制文件数据的存取
来源:互联网 发布:js currenttime 编辑:程序博客网 时间:2024/05/22 13:33
转自:http://home.kaoyan.com/home.php?mod=space&uid=2820987&do=blog&id=46560
简述关键代码如下:
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;
}
- 使用ADO实现vc中二进制文件数据的存取
- 使用ADO实现vc中二进制文件数据的存取(以图像在数据库中的存取为例)
- 使用ADO实现vc中二进制文件数据的存取(以图像在数据库中的存取为例)
- VC中使用ADO实现BLOB数据的存取
- 使用ADO实现BLOB数据的存取
- 使用ADO实现BLOB数据的存取
- 使用ADO存取数据
- 使用ADO实现BLOB数据的存取 -- ADO开发实践之二
- 使用ADO实现BLOB数据的存取 -- ADO开发实践之二
- 使用ADO实现BLOB数据的存取 -- ADO开发实践之二
- ADO存取二进制文件
- VC++ ADO数据存取(一)
- VC++ ADO数据存取(二)
- VC中ADO的使用
- C语言实现myql中存取二进制文件
- 用ado 在 access 存取二进制文件的一种办法
- ADO.NET 的数据存取性能
- ADO.NET 的数据存取性能
- 查看python中关键字
- Python---5.条件选择和python真假值
- leetcode 45. Jump Game II 贪心算法&&DFS深度优先搜索
- 启发式算法(Heuristic Algorithm)
- 《旧中国的黑社会》读后感
- 使用ADO实现vc中二进制文件数据的存取
- 1-3、常用概率分布与随机数生成
- git命令
- 单链表排序
- Vue2 全局-Vue.set更新vue数据
- 深入探究JVM | klass-oop对象模型研究
- 【机器学习】Kaggle-Titanic:Machine Learning from Disaster
- 成绩转换 HDU
- 小工具-日历选择器(javascript)