網(wǎng)上好象這個例子還沒有樣,如果你用VC做一個人事部管理系統(tǒng),不可能沒有人員照片吧!能找到的例子中都是用BMP,不敢用!
這個例子用到了VC6.0和access2002(officeXP),涉及到ADO的用法,文件對話框的使用,一個CPicture類和一個buffer緩沖區(qū)。
一、我的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");///創(chuàng)建Connection對象 if(SUCCEEDED(hr)) { hr = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=wy.mdb","","",adModeUnknown);///連接數(shù)據(jù)庫 ///上面一句中連接字串中的Provider是針對ACCESS2000環(huán)境的,對于ACCESS97,需要改為:Provider=Microsoft.Jet.OLEDB.3.51; }}catch(_com_error e)///捕捉異常{ CString errormessage; errormessage.Format("打開 wy.mdb 數(shù)據(jù)庫失敗!\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("讀取數(shù)據(jù)庫失敗!");///顯示錯誤信息}
CPicture類(它能夠顯示JPG.GIF等等圖片,詳情請看CPicture.h頭文件)
CPicture.h
CPicture.cpp
二、流程圖

你一看便知: ADO作用在buffer內(nèi)存和ACCESS2002數(shù)據(jù)庫之間,而CPicture作用在buffer內(nèi)存和顯示窗口之間.
三、將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]; //按文件的大小在堆上申請一塊內(nèi)存 if (f.Read(pBuffer, nSize) > 0 ) //把jpg文件讀到pBuffer(堆上申請一塊內(nèi)存) { BYTE *pBuf = pBuffer; ///下面這一大段是把pBuffer里的jpg數(shù)據(jù)放到庫中 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));//接作調(diào)用函數(shù)讀pBuffer的jpg數(shù)據(jù)準備顯示 delete [] pBuffer; //刪掉堆上申請的那一塊內(nèi)存 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) );//顯示出來看看 } }.......
完整的例子中有較多的中文說明,對你有用嗎!?,有什么不妥之處請高手指教