关于用VC,VB进行图像数据(二进制大对象)存储数据库的一点心
来源:互联网 发布:在广电网络上班怎么样 编辑:程序博客网 时间:2024/05/17 03:54
网上经常有人问如何把图像存入数据库中,原先我也是不得要领。经过多方指点和自己在开发过程中的摸索,终于解决这一问题。
下面给出用VC,VB如何操作图像文件存取数据库的原码,帮助一些还没有掌握方法的朋友,也请这方面的高手多多指教。(均用ADO连接数据库)
1. VC把一个文件存入数据库
CFile imagefile;
if(0 == imagefile.Open("d://user//bmp.bmp",CFile::modeRead))
return;
_RecordsetPtr pRs = NULL;
_ConnectionPtr pConnection = NULL;
_variant_t varChunk;
HRESULT hr;
BYTE* pbuf;
long nLength = imagefile.GetLength();
pbuf = new BYTE[nLength+2];
if(pbuf == NULL)
return; //allocate memory error;
imagefile.Read(pbuf,nLength); //read the file into memory
BYTE *pBufEx;
pBufEx = pbuf;
//build a SAFFERRAY
SAFEARRAY* psa;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = nLength;
psa = SafeArrayCreate(VT_UI1, 1, rgsabound);
for (long i = 0; i < nLength; i++)
SafeArrayPutElement (psa, &i, pBufEx++);
VARIANT varBLOB;
varBLOB.vt = VT_ARRAY | VT_UI1;
varBLOB.parray = psa;
_bstr_t strCnn("Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=CUSTOM;Data Source=SERVER");
try
{
//Open a connection
pConnection.CreateInstance(__uuidof(Connection));
hr = pConnection->Open(strCnn,"","",NULL); //Connect a DataBase
pRs.CreateInstance(__uuidof(Recordset));
pRs->Open("CustomInfo",_variant_t((IDispatch *) pConnection,true),adOpenKeyset,adLockOptimistic,adCmdTable); //Open a Table
// pRs->AddNew();
pRs->Fields->GetItem("Image")->AppendChunk(varBLOB);
pRs->Update();
pRs->Close();
pConnection->Close();
}
catch(_com_error &e)
{
// Notify the user of errors if any.
_bstr_t bstrSource(e.Source()); 2. VC把数据库中IMAGE字段取出存为文件 _RecordsetPtr pRs = NULL; LPSTR buffer = (LPSTR)GlobalLock((HGLOBAL)pBuf); pRs->Close(); VC代码部分就是这些了!
_bstr_t bstrDescription(e.Description());
CString sError;
sError.Format("Source : %s /n Description : %s/n",(LPCSTR)bstrSource,(LPCSTR)bstrDescription);
AfxMessageBox(sError);
}
_ConnectionPtr pConnection = NULL;
_variant_t varChunk;
HRESULT hr;
VARIANT varBLOB;
_bstr_t strCnn("Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=CUSTOM;Data Source=SERVER");
try
{
//Open a connection
pConnection.CreateInstance(__uuidof(Connection));
hr = pConnection->Open(strCnn,"","",NULL);
pRs.CreateInstance(__uuidof(Recordset));
pRs->Open("CustomInfo",_variant_t((IDispatch *) pConnection,true),adOpenKeyset,adLockOptimistic,adCmdTable);
//read data
long lDataLength = pRs->Fields->GetItem("Image")->ActualSize;
varBLOB = pRs->GetFields()->GetItem("Image")->GetChunk(lDataLength);
if(varBLOB.vt == (VT_ARRAY | VT_UI1))
{
BYTE *pBuf = NULL;
pBuf = (BYTE*)GlobalAlloc(GMEM_FIXED,lDataLength);
SafeArrayAccessData(varBLOB.parray,(void **)pBuf);
//Build a File in Windows Temp Directory
char tmpPath[_MAX_PATH+1];
GetTempPath(_MAX_PATH,tmpPath);
CString strFileName = "temp.bmp";
strFileName = tmpPath+strFileName;
CFile outFile(strFileName,CFile::modeCreate|CFile::modeWrite);
outFile.WriteHuge(buffer,lDataLength);
GlobalUnlock((HGLOBAL)pBuf);
outFile.Close();
SafeArrayUnaccessData (varBLOB.parray);
}
pConnection->Close();
}
catch(_com_error &e)
{
// Notify the user of errors if any.
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
CString sError;
sError.Format("Source : %s /n Description : %s/n",(LPCSTR)bstrSource,(LPCSTR)bstrDescription);
AfxMessageBox(sError);
}
- 关于用VC,VB进行图像数据(二进制大对象)存储数据库的一点心
- 关于用VC,VB进行图像数据(二进制大对象)存储数据库的一点心得
- 用VC,VB进行图像数据(二进制大对象)存储数据库的方法
- VB二进制存储数据
- VB数据库编程的几点心得
- VB数据库编程的几点心得
- JDBC处理大数据(存储图像、声音、二进制)
- 关于用VC对图像进行裁剪
- JDBC处理大数据(大二进制数据的存储和读取)
- VB数据库编程的几点心得(上)
- VB实现图像在数据库的存储与显示
- 使用用VB处理MYSQL数据库中二进制数据问题
- 存储、读取二进制的图像
- 数据库存储大对象
- 关于专用存储组件研究的几点心得
- 如何快速建立自己的大数据库进行大数据测试一(解答)
- 用VC存取数据库中的大对象
- 用VC存取数据库中的大对象
- 武汉行
- SDRAM原理 - SDRAM的逻辑Bank与芯片容量表示方法
- 随笔Nexus
- 建议
- 老婆感冒了
- 关于用VC,VB进行图像数据(二进制大对象)存储数据库的一点心
- Ubutu 8.04下安装tomcat-5.5.20
- 应届毕业生,绝对有你不知道的——档案,面试,合同法,薪水,为人处事等问题
- 重定向与转发有何区别?
- 第一个vs网站
- 简单理解Servlet的生命周期
- Android SDCard Filesystem
- Ajax入门,第 2 部分: 使用 JavaScript 和 Ajax 发出异步请求
- JNI简介及实例