山寨:不是最好的,是最适合我们的!欢迎体验山寨 中文版MSDN

Blog @ Blog

当华美的叶片落尽,生命的脉络才历历可见。 -- 聂鲁达

常用链接

统计

积分与排名

BBS

Blog

Web

最新评论

关于用VC进行图像数据(二进制大对象)存储数据库的一点心得

下面给出用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());
        _bstr_t bstrDescription(e.Description());
        CString sError;
        sError.Format(
"Source : %s \n Description : %s\n",(LPCSTR)bstrSource,(LPCSTR)bstrDescription);
        AfxMessageBox(sError);     
 }


 2. VC把数据库中IMAGE字段取出存为文件
    _RecordsetPtr pRs = NULL;
    _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);

            LPSTR buffer 
= (LPSTR)GlobalLock((HGLOBAL)pBuf);
            outFile.WriteHuge(buffer,lDataLength);
            GlobalUnlock((HGLOBAL)pBuf);
            outFile.Close();           
            SafeArrayUnaccessData (varBLOB.parray);
       }


        pRs
->Close();
        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);     
 }
 
转自:http://dev.rdxx.com/VC/VCDB/2001-10/6/024749171.shtml

posted on 2008-06-13 09:21 isabc 阅读(650) 评论(0)  编辑 收藏 引用 所属分类: 数据库


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


广告信息(免费广告联系)

中文版MSDN:
欢迎体验