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

关于用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

你可能感兴趣的:(关于用VC进行图像数据(二进制大对象)存储数据库的一点心得)