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

用MFC + ADO 把jpg圖象文件放入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 數據庫失敗! 錯誤信息:%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

二、流程圖



你一看便知: 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) );//顯示出來看看
    }
 

}

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章