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

如您有疑问,可在文末留言,或到QQ群提问。

本站QQ群:291616564 麻辣GIS

微信公众号:malagis,扫描右边二维码直接关注。

微信捐助麻辣GIS 支付宝捐助麻辣GIS

如果本文对您有所帮助,欢迎对我们团队进行打赏捐助,让我们在传播3S的路上可以走得更远。


作者:,GIS爱好者。
分享本文,请您带上本文链接

已有 2 条评论

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

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

  2. boldness
    2#
    boldness  · 2015-11-30 19:19

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

发表评论