CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  数据库

请教各位高手,如何将bmp图存入ACCESS数据库?

楼主ptk(普天客)2001-07-02 16:46:26 在 VC/MFC / 数据库 提问

小弟初来乍道,对数据库只知一二,无从下手,请指点一下. 问题点数:20、回复次数:7Top

1 楼kane_yj()回复于 2001-07-02 17:04:38 得分 0

1,以前有许多这样的帖子--搜一下!  
  2,www.vckbase.com上有许多文档;  
  3,我自己的函数:  
  void   Savebmp_Data()  
    {      
        CDaoRecordSet*   pdata   =   new   CDaoRecordSet();    
        pdata->Open();  
        CString   tempid   =   "Name   =   '"   +   standard_name+"'";  
        ....  
                {  
                      if   (!pdata->CanUpdate())   return;  
                          pdata->Edit();  
                      CString   strupdate   =   "NULL";  
                      pdata->SetFieldValue(_T("[StabitmapFile]"),COleVariant(strupdate));  
                      pdata   ->Update();  
                      goto   ip;          
                }            
                CFile   tempfile;      
                tempfile.Open(strBitmapPath,CFile::modeRead);  
                DWORD   dwBufSize;    
                dwBufSize   =   tempfile.GetLength();  
                Array.SetSize(dwBufSize);            
                tempfile.ReadHuge((LPSTR)(Array.GetData()),   dwBufSize);  
                tempfile.Close();      
                (pdata->m_StabitmapFile).Copy(Array);  
                if   (!m_pStandard->CanUpdate())   return;        
                pdata->Edit();      
                pdata->SetFieldValue(_T("[StabitmapFile]"),COleVariant(Array));    
                pdata->Update();            
        }  
  ip:      
      pdata->Close();    
        delete   pdata;  
    }            
  Top

2 楼ptk(普天客)回复于 2001-07-02 17:17:55 得分 0

多谢,请问有ADO的例子么?是不是用ado好一些?有这方面的资料或地址,推荐一下好么?实在是急,请多指教.哦,我还不知道怎么送分呢?抱歉!Top

3 楼ptk(普天客)回复于 2001-07-02 17:19:08 得分 0

加分了么?Top

4 楼panda_w(好想睡啊!)回复于 2001-07-02 17:19:10 得分 0

http://www.vckbase.com/article/mfc_database/0009.htmTop

5 楼panda_w(好想睡啊!)回复于 2001-07-02 17:22:02 得分 0

可以到VChelp.net找一些例子Top

6 楼kane_yj()回复于 2001-07-02 17:23:30 得分 20

给你一篇文章(摘自vckbase10,下载地址:http://www.vckbase.com/vckbase/vckbase10/vckbase10.chm)  
   
    VCKBASE   Online   Help   Journal   No.10        
     
   
  使用ADO实现BLOB数据的存取   --   ADO开发实践之二  
  作者:浙江省温岭市电信局   王骏    
   
  一、前言  
  在上一篇文章《ADO第一次亲密接触》中我们详细介绍了ADO基本的操作方法,在实际的开发过程中我们常常需要存储较大的二进制数据对象,比如:图像、音频文件、或其它二进制数据,这些数据我们称之为二进制大对象BLOB(Binary   Large   Object),其存取的方式与普通数据有所区别。本文将介绍利用ADO在数据库中存取BLOB数据的具体实现过程,并给出实现图像存取显示的完整示例工程。  
   
   
  二、前期准备  
  首先我们建立一张名为userinfo的表,包含三个字段:id,username,old,photo,其中photo是一个可以存储二进制数据的字段。  
  2.1   在SQL   SERVER中我们可以在Query   Analyzer中直接输入如下语句创建:  
   
   
  CREATE   TABLE   [dbo].[userphoto]   (  
  [id]   [int]   IDENTITY   (1,   1)   NOT   NULL   ,  
  [username]   [varchar]   (50)   NULL   ,  
  [old]   [int]   NULL   ,  
  [photo]   [image]   NULL    
  )   ON   [PRIMARY]   TEXTIMAGE_ON   [PRIMARY]  
  其中photo我们定义为image类型的字段。  
   
   
  2.2   在ACCESS中创建的方法如下:  
  建立一张新表包括id,username,old,photo四个字段,然后打开表,选视图菜单中设计视图,将id设置为自动编号的递增长整型,username为文本,old为数字,photo为OLE对象。  
  在我们的示例工程中已经包含了一个建立好的ACCESS2000的库,你可以直接拿来使用。  
   
   
  三、具体步骤  
  3.1   BLOB数据的保存  
  BLOB类型的数据无法用普通的方式进行存储,我们需要使用AppendChunk函数,AppendChunk包含在Field对象中,原型如下:  
  HRESULT   AppendChunk   (const   _variant_t   &   Data   );  
  从函数原型中可以看到关键的问题是我们需把二进制数据赋值给VARIANT类型的变量,下面我们给出具体的代码并作简单的分析:  
   
   
   
     
  ///假设m_pBMPBuffer指针指向一块长度为m_nFileLen的二进制数据,并且已经成功打开了记录集对象m_pRecordset///  
   
  char *pBuf   =   m_pBMPBuffer;  
  VARIANT varBLOB;  
  SAFEARRAY *psa;  
  SAFEARRAYBOUND rgsabound[1];  
   
  m_pRecordset->AddNew();                                                                                             ///添加新记录  
  m_pRecordset->PutCollect("username",_variant_t("小李"));                           ///为新记录填充username字段  
  m_pRecordset->PutCollect("old",_variant_t((long)28);                                   ///填充old字段  
  if(pBuf)  
  {          
        rgsabound[0].lLbound   =   0;  
        rgsabound[0].cElements   =   m_nFileLen;  
        psa   =   SafeArrayCreate(VT_UI1,   1,   rgsabound);                                             ///创建SAFEARRAY对象  
        for   (long   i   =   0;   i   <   (long)m_nFileLen;   i++)  
              SafeArrayPutElement   (psa,   &i,   pBuf++);                                                   ///将pBuf指向的二进制数据保存到SAFEARRAY对象psa中  
        varBLOB.vt   =   VT_ARRAY   |   VT_UI1;                                                                       ///将varBLOB的类型设置为BYTE类型的数组  
        varBLOB.parray   =   psa;                                                                                           ///为varBLOB变量赋值  
        m_pRecordset->GetFields()->GetItem("photo")->AppendChunk(varBLOB);///加入BLOB类型的数据  
  }    
  m_pRecordset->Update();                                                                                             ///保存我们的数据到库中  
  至此我们的数据已经成功地保存到了数据库中,接下来我们所要做的工作便是将该数据提取出来,让我们继续吧!  
   
  3.2   BLOB数据的读取  
  对应于保存数据时我们所使用的AppendChunk函数,读取数据应该使用GetChunk函数,GetChunk的原型如下:  
  _variant_t   GetChunk   (long   Length   );  
  给出数据的长度后GetChunk将返回包含数据的VARIANT类型变量,然后我们可以利用SafeArrayAccessData函数得到VARIANT变量中指向数据的char   *类型的指针,以方便我们的处理,具体代码如下:  
   
   
   
  long   lDataSize   =   m_pRecordset->GetFields()->GetItem("photo")->ActualSize;///得到数据的长度  
  if(lDataSize   >   0)  
  {  
        _variant_t   varBLOB;  
        varBLOB   =   m_pRecordset->GetFields()->GetItem("photo")->GetChunk(lDataSize);  
        if(varBLOB.vt   ==   (VT_ARRAY   |   VT_UI1))                                                                   ///判断数据类型是否正确  
        {  
                  char   *pBuf   =   NULL;  
                  SafeArrayAccessData(varBLOB.parray,(void   **)&pBuf);                             ///得到指向数据的指针  
                  /*****在这里我们可以对pBuf中的数据进行处理*****/  
                  SafeArrayUnaccessData   (varBLOB.parray);  
        }  
  }  
  以上我们成功实现了BLOB数据在数据库中的存取,为了让大家有现成的例子可以参考,本文提供了示例工程,在示例工程中我们在数据库中保存图像数据,并可以对这些图像进行浏览、修改,该例子还涉及到如何用char   *指向的BMP文件数据创建BITMAP对象然后显示出来。  
  点这里下载示例工程  
   
  四、后记  
  在上一篇文章《ADO第一次亲密接触》发表后,得到了广大网友的大力支持和鼓励,还指正了文章中的错误之处,这些都促使我继续写下了这篇文章,在此向这些网友表示衷心的感谢,对于本文的错误之处也希望批评指正!  
   
     
  加分方法:点你问题右边的"管理",加分喽!  
   
  Top

7 楼skt985(傻问天)回复于 2002-01-11 13:04:02 得分 0

35681关注!   :)Top

相关问题

  • 使用ASP怎样把bmp存入MS SQL数据库中。
  • jpg图象(bmp也行)如何存入数据库? 急!!!
  • 怎样在SQL2000数据库中存入图像(.bmp ,.jpg)?急!!!!
  • 如何实现数据库图片deimags控件的bmp图片存入数据库指定位置
  • vb如何将图形存入access数据库?
  • vb如何将图形存入access数据库?急急急
  • 将数组存入Access数据库自动添加了空格???
  • 请问:怎样将图片(Bmp,Jpeg...)保存入数据库的ole字段中
  • 如何将数组存入access数据库的一个字段中。
  • 为什么向ACCESS数据库存入图片出现INSERT INTO错误

关键词

  • 数据
  • 函数
  • 字段
  • 数据库
  • 二进制
  • 指针
  • 原型
  • pdata
  • varblob
  • appendchunk

得分解答快速导航

  • 帖主:ptk
  • kane_yj

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo