VC-用MFC + ADO 把jpg图象文件放入ACCESS库中

本文介绍如何使用MFC和ADO技术将JPG图片文件存入Access数据库,并从数据库中读取出图片进行显示。文章详细展示了从文件读取、数据库连接到记录集操作的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用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) );//显示出来看看
    }
 

}

 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值