• 用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 数据库失败!/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

    二、流程图



    你一看便知: 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) );//显示出来看看
    	} 
    
    }
    .......
    完整的例子中有较多的中文说明,对你有用吗!?,有什么不妥之处请高手指教 
  • 相关阅读:
    java学习笔记----数据类型,变量,常量
    java学习笔记 --- java基础语法
    java学习笔记----java入门
    python 类方法
    nginx 限制ip/限制访问路径
    python 异常处理
    python 内置模块
    python 模块与包
    python函数基础用法
    python函数高级运用
  • 原文地址:https://www.cnblogs.com/rainbowzc/p/2422266.html
Copyright © 2020-2023  润新知