MFC+ADOでjpgイメージファイルをACCESSライブラリに入れる

3544 ワード

ネット上ではこの例はまだないようですが、VCで人事部管理システムを作ったら、人員写真がないはずがありません.見つけられる例はすべてBMPで、使う勇気がありません!
この例はVC 6を用いた.0とaccess 2002(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.hCPicture.cpp 2、フローチャートを見ると、ADOはbufferメモリとACCESS 2002データベースの間に作用し、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) );//      

	} 



}

.......
完全な例の中で多くの中国語の説明があって、あなたに役に立ちますか!?何か不都合な点がございましたら、よろしくお願いいたします