VC++开发GIS系统(5)利用ADO技术实现SQL Server存储二进制数据
发布时间: 2014-08-24
所属分类: VC++开发GIS系统
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
相关阅读
声明
1.本文所分享的所有需要用户下载使用的内容(包括但不限于软件、数据、图片)来自于网络或者麻辣GIS粉丝自行分享,版权归该下载资源的合法拥有者所有,如有侵权请第一时间联系本站删除。
2.下载内容仅限个人学习使用,请切勿用作商用等其他用途,否则后果自负。
手机阅读
公众号关注
知识星球
手机阅读
最新GIS干货
私享圈子
你好,我们最近在上地理信息工程的课,老师说存储线,面这样的可以用二进制流,我不太会,想请教一下。还有能告诉我这个二进制的操作对应数据库的表是什么样的吗?字段,属性这些,谢谢!
如何从数据库中提取出图片并显示在多文档窗口,希望楼主能详细介绍一下,谢谢啦
你好,本教程的源代码的地址失效了,作者大大可以再分享一次吗,想要参考一下从文件到数据库的转变
具体源代码已经不提供了,核心的代码就是这些。
我写了一个读取Image的程序,VS2017环境下VC操作ACCESS,亲测可用,欢迎下载。
https://download.csdn.net/download/weixin_38327010/14982040