麻辣GIS微信平台

更多 GIS 干货

微信关注不错过

VC++开发GIS系统(5)利用ADO技术实现SQL Server存储二进制数据

GIS系统中经常会使用数据库作为数据存储管理工具,像一些大型的GIS软件甚至会封装一个SDE(详见这里),本文中提供了一个示例,即通过VC++的ADO技术来访问数据库。如图:

主要功能是实现图片以二进制的方式存储到数据库,然后从数据库读出并保存成文件。

关于ADO编程

在我之前的博客中有详细的介绍,可以参考VC++ADO编程小记ADO编程RecordSet.OPEN参数解释ADO编程多步OLE DB 操作产生错误这3篇文章。

关键代码

ADO环境初始化
BOOL readImages::OnInitDialog()
{
  CDialog::OnInitDialog();

  // TODO:  在此添加额外的初始化
  //*****初始化ADO库******

  ::CoInitialize(NULL);// 初始化OLE/COM库环境

  try
  {
    // 创建Connection对象
    m_pConnection.CreateInstance("ADODB.Connection");
    // 设置连接字符串,必须是BSTR型或者_bstr_t类型
    //_bstr_t strConnect ="Provider=SQLOLEDB;Data Source=YQC-PC\\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=testADO";
    _bstr_t strConnect="Provider=SQLOLEDB; Server=localhost; Database=testADO; uid=sa; pwd=Sailor_1990;"; 
    //m_pConnection->Open(strConnect,"","",adModeUnknown);
    m_pConnection->Open(strConnect,"","",NULL);
        if(m_pConnection!=NULL)
    {
      AfxMessageBox(_T("数据库连接成功"));
    }
  }
  // 捕捉异常
  catch(_com_error e)
  {
    // 显示错误信息
    AfxMessageBox(e.Description());
  }

  return TRUE;  // return TRUE unless you set the focus to a control
  // 异常: OCX 属性页应返回 FALSE
}
存储数据库
void readImages::OnBnClickedButtonSavetodb()
{
  variant_t varBLOB;
  _StreamPtr pStm;
  pStm.CreateInstance ( "ADODB.Stream" ) ;
  variant_t varOptional(DISP_E_PARAMNOTFOUND,VT_ERROR);
  pStm->PutType ( adTypeBinary); //类型为二进制

  pStm->Open( varOptional, adModeUnknown, adOpenStreamUnspecified, 
    _bstr_t() , _bstr_t() ) ; //生成二进制流
  pStm->LoadFromFile ( _bstr_t (m_filepath) ) ; //读入文件
  varBLOB = pStm->Read( adReadAll) ;
  if(FAILED(m_pRecordset.CreateInstance("ADODB.Recordset")))
  {
    return;
  }

  try
  {
    m_pRecordset->Open(_bstr_t(_T("imageADO")),_variant_t((IDispatch *)m_pConnection,true), adOpenDynamic,adLockOptimistic, adCmdTable);
  } 
  catch(_com_error e)
  {
    AfxMessageBox(e.Description());

  }
  try
  {
    m_pRecordset->AddNew();
    m_pRecordset->PutCollect("p",(variant_t)m_filepath);
    m_pRecordset->PutCollect( "cao",varBLOB);
    m_pRecordset->PutCollect( "t",(variant_t)m_fileType);
  }
  catch(_com_error e)
  {
    AfxMessageBox(e.Description());
  }
  m_pRecordset->Update();
  m_pRecordset->Close();
  MessageBox(_T("OK"));
}
从数据库读文件
void DBToFile::OnBnClickedButtonTofile()
{
  // TODO: 在此添加控件通知处理程序代码
  variant_t varBLOB;
  _StreamPtr pStm;

  pStm.CreateInstance ( "ADODB.Stream" ) ;
  variant_t varOptional(DISP_E_PARAMNOTFOUND,VT_ERROR) ;
  pStm->PutType ( adTypeBinary); //类型为二进制

  pStm->Open( varOptional, adModeUnknown, adOpenStreamUnspecified, 
    _bstr_t() , _bstr_t() ) ; //生成二进制流

  m_pRecordset.CreateInstance(__uuidof(Recordset));
  m_pRecordset->Open(_bstr_t(_T("select cao from imageADO where id=1")), m_pConnection.GetInterfacePtr(), adOpenDynamic , adLockOptimistic, adCmdText);

  pStm->Write( m_pRecordset->GetFields()->GetItem( "cao" )->Value ); //写入流文件
  pStm->SaveToFile ((_bstr_t)m_filepath, adSaveCreateOverWrite);
  MessageBox(_T("导出成功"));
  m_pRecordset->Close();

}

具体有什么问题欢迎留言,下面是整个程序代码,欢迎下载研究。

链接:http://pan.baidu.com/s/1kT5fKf9

密码:s2c9

相关阅读

麻辣GIS-Sailor

作者:

GIS爱好者,学GIS,更爱玩GIS。

声明

1.本文所分享的所有需要用户下载使用的内容(包括但不限于软件、数据、图片)来自于网络或者麻辣GIS粉丝自行分享,版权归该下载资源的合法拥有者所有,如有侵权请第一时间联系本站删除。

2.下载内容仅限个人学习使用,请切勿用作商用等其他用途,否则后果自负。

手机阅读
公众号关注
知识星球
手机阅读
麻辣GIS微信公众号关注
最新GIS干货
关注麻辣GIS知识星球
私享圈子

已有 5 条评论

  1. 麻辣GIS-lu
    1#
    lu  · 2015-11-01 19:29

    你好,我们最近在上地理信息工程的课,老师说存储线,面这样的可以用二进制流,我不太会,想请教一下。还有能告诉我这个二进制的操作对应数据库的表是什么样的吗?字段,属性这些,谢谢!

  2. 麻辣GIS-boldness
    2#
    boldness  · 2015-11-30 19:19

    如何从数据库中提取出图片并显示在多文档窗口,希望楼主能详细介绍一下,谢谢啦

  3. 麻辣GIS-zhuzhu
    3#
    zhuzhu  · 2019-10-21 18:10

    你好,本教程的源代码的地址失效了,作者大大可以再分享一次吗,想要参考一下从文件到数据库的转变

      1. 麻辣GIS-Sailor
        Sailor  · 2019-11-08 13:19

        具体源代码已经不提供了,核心的代码就是这些。

  4. 麻辣GIS-范_先生2021
    4#
    范_先生2021  · 2021-02-01 12:34

    我写了一个读取Image的程序,VS2017环境下VC操作ACCESS,亲测可用,欢迎下载。
    https://download.csdn.net/download/weixin_38327010/14982040

留言板(小编看到第一时间回复)