程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Access數據庫 >> 關於Access數據庫 >> 用MFC + ADO 把jpg圖象文件放入ACCESS庫中

用MFC + ADO 把jpg圖象文件放入ACCESS庫中

編輯:關於Access數據庫

網上好象這個例子還沒有樣,如果你用VC做一個人事部管理系統,不可能沒有人員照片吧!能找到的例子中都是用BMP,不敢用!

  這個例子用到了VC6.0和Access2002(OfficeXP),涉及到ADO的用法,文件對話框的使用,一個CPicture類和一個buffer緩沖區。

  一、我的ADO用法整理

  1. stdafx.h頭文件中加入:

#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
  2. 應用程序初始化中加入:

AfxOleInit();
HRESULT hr;
try
{
  hr = m_pConnection.CreateInstance("ADODB.Connection");///創建Connection對象
  if(SUCCEEDED(hr))
  {
  hr = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=wy.mdb","","",adModeUnknown);///連接數據庫
  ///上面一句中連接字串中的Provider是針對ACCESS2000環境的,對於Access97,需要改為:Provider=Microsoft.Jet.OLEDB.3.51;
  }
}
catch(_com_error e)///捕捉異常
{
  CString errormessage;
  errormessage.Format("打開 wy.mdb 數據庫失敗!\r\n錯誤信息:%s",e.ErrorMessage());
  AfxMessageBox(errormessage);///顯示錯誤信息
}
  3. 應用程序EXIT中加入:

if (m_pConnection->State)
    m_pConnection->Close();
  4. 應用程序中加入:

_ConnectionPtr m_pConnection;
  5. 對話框類中加入:

_RecordsetPtr m_pRecordset;
  6. 注意使用:

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

  二、流程圖

用MFC + ADO 把jpg圖象文件放入ACCESS庫中(圖一)

你一看便知: 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. 下一頁:
Copyright © 程式師世界 All Rights Reserved