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

2016-02-19 13:31 55 1 收藏

get新技能是需要付出行动的,即使看得再多也还是要动手试一试。今天图老师小编跟大家分享的是用MFC + ADO 把jpg图象文件放入ACCESS库中,一起来学习了解下吧!

【 tulaoshi.com - 编程语言 】

  网上好象这个例子还没有样,如果你用VC做一个人事部管理系统,不可能没有人员照片吧!能找到的例子中都是用BMP,不敢用!

  这个例子用到了VC6.0和access2002(officeXP),涉及到ADO的用法,文件对话框的使用,一个CPicture类和一个buffer缓冲区。

  一、我的ADO用法整理

  1. stdafx.h头文件中加入:

#import "c:program filescommon filessystemadomsado15.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. 注意使用:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

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存入库并显示

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

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) );//显示出来看看
  }
}
.......
  完整的例子中有较多的中文说明,对你有用吗!?,有什么不妥之处请高手指教

来源:http://www.tulaoshi.com/n/20160219/1604548.html

延伸阅读
当你使用DAO访问Access2000时,是否会出現以下的错误信息? "Run-timeerror3343UnrecognizedDatabaseFormatXXX" 这个错误信息有二个解決的方式: 1、如果你是使用DataControl来连結Access2000的资料库时: 你必須在設定DataControl的Source前先加上一行 SetData1.Recordset=rsDAO36'rsDAO36isaDAO3...
原理就是通过枚举数据库中的表的类型,用户建立的表的类型一般是TBALE。所以通过判断当前数据库中表的类型,就可以获取表的名称了。 初始化部分 在stdafx.h中添加: #include icrsint.h #include basetsd.h #include ole2.h #import "c:Program FilesCommon FilesSystemADOmsado15.dll" no_namespace rename("EOF", "EndOfFile")  ...
以前使用 DAO 時,Microsoft 有提供 CompactDatabase Method 來压缩 Microsoft Access 文件,RepairDatabase Method 來修复损坏的 Microsoft Access 文件,。可是自从 ADO 出來之后,好像忘了提供相对的压缩及修复 Microsoft Access 文件的功能。 現在 Microsoft 发现了这个问题了,也提供了解決方法,不过有版本上的限制!限制說明...
本人最近正在进行呼叫中心的座席端和服务器软件开发,座席端登录部分是进行提取主机信息,然后使用SOCKET提交给远程服务器,服务器再在后台数据库中进行查找信息,进行对比,看是否允许座席端主机登录,因为我的电脑中无法安装SQLSERVER,所以 , 后台数据库暂时使用access小型数据库进行代替,到后期可以改为SQLSERVER数据库,,我在后台数据...
很多朋友想用SQL2000数据库的编程方法,但是却又苦于自己是学ACCESS的,对SQL只是一点点的了解而已,这里我给大家提供以下参考---将ACCESS转化成SQL2000的方法和注意事项 一,首先,我说的是在ACCESS2000,SQL2000之间转换,其他的我也还没有尝试过,希望大家多多试验,肯定是有办法的; 二,转换的方法 1,打开”控制面...

经验教程

154

收藏

17
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部