VC进行图像jpg数据(二进制大对象)存储数据库SQL

1. VC把一个文件存入数据库

 CFile imagefile;
 CFileException fileerr;
 if(!imagefile.Open(".\\Pic\\20080806_0824_川A33181_in.jpg", CFile::modeRead | CFile::typeBinary, &fileerr)) //打开了一个jpg文件
  return;

 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 = pbuf;
 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;
 
    try
    {
        //Open a connection
  OleInitialize(NULL);
  _RecordsetPtr pRs;            
  _ConnectionPtr pConnection(__uuidof(Connection));
  bstr_t strCnn = GetConnectionString();
        //pConnection.CreateInstance(__uuidof(Connection));
  pConnection->Open(strCnn,"","",NULL);   //Connect a DataBase
  pRs.CreateInstance(__uuidof(Recordset));
  pRs->Open("LicenseImage",_variant_t((IDispatch *) pConnection,true),adOpenKeyset,adLockOptimistic,adCmdTable);  //Open a Table

  pRs->AddNew();
  pRs->PutCollect("CarImageName",_variant_t("20080806_0824_川A33181_in.jpg"));
  pRs->Fields->GetItem("ImageLicense")->AppendChunk(varBLOB);       
  pRs->Update();
  pRs->Close();
  pRs.Release();
  pConnection->Close();
  pConnection.Release();
 }
 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);    
 }
 OleUninitialize();
 delete [] pbuf;
 pbuf = NULL;

 2. VC把数据库中IMAGE字段取出存为文件
try
 {
        //Open a connection
  OleInitialize(NULL);
  _RecordsetPtr pRs = NULL;
  _ConnectionPtr pConnection = NULL;
  _variant_t varBLOB;
  bstr_t strCnn = GetConnectionString();
  pConnection.CreateInstance(__uuidof(Connection));
  pConnection->Open(strCnn,"","",NULL);       
  pRs.CreateInstance(__uuidof(Recordset));
  pRs->Open("LicenseImage",_variant_t((IDispatch *) pConnection,true),adOpenKeyset,adLockOptimistic,adCmdTable);
  //read  data
  CString strImageName = pRs->GetCollect("CarImageName").bstrVal;
  long lDataLength = pRs->Fields->GetItem("ImageLicense")->ActualSize;
  varBLOB = pRs->GetFields()->GetItem("ImageLicense")->GetChunk(lDataLength);
  if(varBLOB.vt == (VT_ARRAY | VT_UI1))       
  {
   if(BYTE *pBuffer = new BYTE [lDataLength+1])
   {
    char *pBuf = NULL;
    SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
    memcpy(pBuffer,pBuf,lDataLength);    ///复制数据到缓冲区m_pBMPBuffer
    SafeArrayUnaccessData (varBLOB.parray);
    //Build a File in Windows Temp Directory
    char tmpPath[_MAX_PATH+1];
    GetModuleFileName(AfxGetApp()->m_hInstance, tmpPath, _MAX_PATH);
    CString strPath = tmpPath;
    strImageName = strPath.Left(strPath.ReverseFind('\\')+1)+strImageName;
    CFile outFile(strImageName,CFile::modeCreate|CFile::modeWrite);
    LPSTR buffer = (LPSTR)GlobalLock((HGLOBAL)pBuf);
    outFile.WriteHuge(buffer,lDataLength);
    GlobalUnlock((HGLOBAL)pBuf);
    outFile.Close();
    delete [] pBuffer;
    pBuffer = NULL;
   }
  }
  
  pRs->Close();
  pRs.Release();
  pConnection->Close();
  pConnection.Release();
 }
 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);    
 }
 OleUninitialize();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值