WEB开发网
开发学院软件开发VC 用MFC + ADO 把jpg图象文件放入ACCESS库中 阅读

用MFC + ADO 把jpg图象文件放入ACCESS库中

 2006-07-23 11:18:31 来源:WEB开发网   
核心提示: extern CWYApp theApp;7. 使用纪录集:try{m_pRecordset.CreateInstance("ADODB.Recordset");m_pRecordset->Open("SELECT * FROM 客户 ORDER BY
extern CWYApp theApp;

7. 使用纪录集:

try
{
  m_pRecordset.CreateInstance("ADODB.Recordset");
  m_pRecordset->Open("SELECT * FROM 客户 ORDER BY 客户id",
        _variant_t((IDispatch*)theApp.m_pConnection,true),
        adOpenStatic,adLockOptimistic,adCmdText);
}
catch(_com_error e)///捕捉异常
{
  AfxMessageBox("读取数据库失败!");///显示错误信息
}

CPicture类(它能够显示JPG.GIF等等图片,详情请看CPicture.h头文件)

CPicture.h

CPicture.cpp

二、流程图

你一看便知: ADO作用在buffer内存和ACCESS2002数据库之间,而CPicture作用在buffer内存和显示窗口之间. 

三、将jpg存入库并显示

void COneDlg::OnButton1()   
{
  CFile f;
  CString FilePathName;
  CFileException e;
  CFileDialog dlg(TRUE,NULL,NULL,0,"jpg Files (*.jpg)|*.jpg||",this);
  if(dlg.DoModal()==IDOK)
  {
    FilePathName=dlg.GetPathName();
    if(m_Pic.m_IPicture != NULL) m_Pic.FreePictureData(); // Important - Avoid Leaks...
    if(f.Open(FilePathName, Cfile::modeRead | Cfile::typeBinary, &e)) //打开了一个jpg文件
    {
      int nSize = f.GetLength();     //先得到jpg文件长度
      BYTE * pBuffer = new BYTE [nSize]; //按文件的大小在堆上申请一块内存
 
      if (f.Read(pBuffer, nSize) > 0 )  //把jpg文件读到pBuffer(堆上申请一块内存)
      {
        BYTE *pBuf = pBuffer;   ///下面这一大段是把pBuffer里的jpg数据放到库中
        VARIANT  varBLOB;
        SAFEARRAY *psa;
        SAFEARRAYBOUND rgsabound[1];
  
        m_pRecordset->AddNew(); 
   
        if(pBuf)
        {  
          rgsabound[0].lLbound = 0;
          rgsabound[0].cElements = nSize;
          psa = SafeArrayCreate(VT_UI1, 1, rgsabound);
          for (long i = 0; i < (long)nSize; i++)
          SafeArrayPutElement (psa, &i, pBuf++);
          varBLOB.vt = VT_ARRAY | VT_UI1;
          varBLOB.parray = psa;
          m_pRecordset->GetFields()->GetItem("j")->AppendChunk(varBLOB);
        }
        m_pRecordset->Update();
   
      (m_Pic.LoadPictureData(pBuffer, nSize));//接作调用函数读pBuffer的jpg数据准备显示
      delete [] pBuffer;   //删掉堆上申请的那一块内存
      pBuf=0;        //以防二次乱用
      }
      f.Close();
    }
    CClientDC dc(this);    
    m_Pic.UpdateSizeOnDC(&dc); // Get Picture Dimentions In Pixels
    m_Pic.Show(&dc, CRect(200,0,200+m_Pic.m_Width,m_Pic.m_Height) );//显示出来看看
  }
}
.......

完整的例子中有较多的中文说明,对你有用吗!?,有什么不妥之处请高手指教.

上一页  1 2 

Tags:MFC ADO jpg

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接