VC+MO2.0连接ArcSDE并且读出SDE中的空间数据(二)
来源:互联网 发布:南宁seo 编辑:程序博客网 时间:2024/05/16 06:55
开始连接SDE。首先和VB的情形一样,现设置服务参数,我的设置如下:
this->mdc.SetServer(this->m_Service);
this->mdc.SetDatabase(this->m_Instance);
this->mdc.SetUser(this->m_User);
this->mdc.SetPassword(this->m_Password);
mdc是一个CMoDataConnection类型的。这里要说一下错误“valid object expected as argument”,上文也提到过这个。这种异常的原因有多个,我现在发现了几个原因,先提出来看看。
关于“valid object expected as argument”
第一种:声明MO变量要有创建过程,如对mdc应该有this->mdc.CreateDispatch(_TEXT("MapObjects2.DataConnection"))这句话,否则就可能出现错误;对Layer也是同样的道理,在载入多个layer时,每个layer都应该Create,否则到最后只能显示一个图层。
第二种:利用mdc.FindDataset(layername)函数进行查找SDE中的现有图层时,如果layername非法也将出现以上的错误,这个错误可真是把我害惨了,花了我一个下午的时间去找才找出来,希望大伙儿们不要再像我这样受苦了。那究竟layername应该是什么样的呢?比如在(一)中由test.shp创建了layer5表,这里的test是Multipoints类型(还有其他类型)的,而我的数据库名称叫sde,所以FindDataset的参数应该是sde.sde.layer5.shape..multipoints即sde.database.layername.shape.type!参天有眼。其实还可以通过遍历把SDE中的空间数据全读出来:
CMoGeoDatasets dss;
CMoGeoDataset ds;
ds.CreateDispatch("MapObjects2.GeoDataset");
dss = this->mdc.GetGeoDatasets();
short loop = dss.GetCount();
CString lyrname;
CMoLayers lyrs = this->m_MapObject.GetLayers();
for(int i=loop-1;i>0;i--)
{
ds = dss.Item(_variant_t((long)i));
lyrname = ds.GetName();
this->m_mapList.AddString(this->GetSplitCString (lyrname,".",2,TRUE));
layer.CreateDispatch("MapObjects2.MapLayer");//创建新的layer
layer.SetGeoDataset(ds);
lyrs.Add(layer);
layer.ReleaseDispatch();//释放此次layer
}
以上这些代码把上面讲的东西都涉及到了。其中GetSplitCString()是自己写的一个字符串分割函数,它有四个参数,第一个是原始字符串,第二个是分割符号,第三个是分割后结果的位置,第四个是分割方式。关于这个函数可以到我的变编程区去看看,如果有兴趣的话。 关于连接数据库
除了通过连接SDE得到数据外,也可以直接连接shp文件,这样只需要在CMoDataConnection创建后,把它的数据库设置一下就可以了,如this->mdc.SetDatabase("c://Data//")也很简答。这样,我就把SDE的数据通过MO空间,利用VC读到了MO控件中,下一步应该做什么呢?我想直接进入查询,有了结果就会下回分解的。
this->mdc.SetServer(this->m_Service);
this->mdc.SetDatabase(this->m_Instance);
this->mdc.SetUser(this->m_User);
this->mdc.SetPassword(this->m_Password);
mdc是一个CMoDataConnection类型的。这里要说一下错误“valid object expected as argument”,上文也提到过这个。这种异常的原因有多个,我现在发现了几个原因,先提出来看看。
关于“valid object expected as argument”
第一种:声明MO变量要有创建过程,如对mdc应该有this->mdc.CreateDispatch(_TEXT("MapObjects2.DataConnection"))这句话,否则就可能出现错误;对Layer也是同样的道理,在载入多个layer时,每个layer都应该Create,否则到最后只能显示一个图层。
第二种:利用mdc.FindDataset(layername)函数进行查找SDE中的现有图层时,如果layername非法也将出现以上的错误,这个错误可真是把我害惨了,花了我一个下午的时间去找才找出来,希望大伙儿们不要再像我这样受苦了。那究竟layername应该是什么样的呢?比如在(一)中由test.shp创建了layer5表,这里的test是Multipoints类型(还有其他类型)的,而我的数据库名称叫sde,所以FindDataset的参数应该是sde.sde.layer5.shape..multipoints即sde.database.layername.shape.type!参天有眼。其实还可以通过遍历把SDE中的空间数据全读出来:
CMoGeoDatasets dss;
CMoGeoDataset ds;
ds.CreateDispatch("MapObjects2.GeoDataset");
dss = this->mdc.GetGeoDatasets();
short loop = dss.GetCount();
CString lyrname;
CMoLayers lyrs = this->m_MapObject.GetLayers();
for(int i=loop-1;i>0;i--)
{
ds = dss.Item(_variant_t((long)i));
lyrname = ds.GetName();
this->m_mapList.AddString(this->GetSplitCString (lyrname,".",2,TRUE));
layer.CreateDispatch("MapObjects2.MapLayer");//创建新的layer
layer.SetGeoDataset(ds);
lyrs.Add(layer);
layer.ReleaseDispatch();//释放此次layer
}
以上这些代码把上面讲的东西都涉及到了。其中GetSplitCString()是自己写的一个字符串分割函数,它有四个参数,第一个是原始字符串,第二个是分割符号,第三个是分割后结果的位置,第四个是分割方式。关于这个函数可以到我的变编程区去看看,如果有兴趣的话。 关于连接数据库
除了通过连接SDE得到数据外,也可以直接连接shp文件,这样只需要在CMoDataConnection创建后,把它的数据库设置一下就可以了,如this->mdc.SetDatabase("c://Data//")也很简答。这样,我就把SDE的数据通过MO空间,利用VC读到了MO控件中,下一步应该做什么呢?我想直接进入查询,有了结果就会下回分解的。
- VC+MO2.0连接ArcSDE并且读出SDE中的空间数据(二)
- VC+MO2.0连接ArcSDE并且读出SDE中的空间数据(三)
- VC+MO2.0连接ArcSDE并且读出SDE中的空间数据(一)
- ArcSDE空间数据库中SDE用户使用
- 清除arcsde空间垃圾数据以及解决sde图层名称被占用的问题
- 清除arcsde空间垃圾数据以及解决sde图层名称被占用的问题
- 清除arcsde空间垃圾数据以及解决sde图层名称被占用的问题
- 清除arcsde空间垃圾数据以及解决sde图层名称被占用的问题
- ArcSDE:C#创建SDE要素数据集
- SDE-----空间数据引擎
- 空间数据shp md gdb用sde连接
- ArcEngine连接SDE数据
- ArcSDE空间数据库中SDE用户使用探讨
- ArcSDE空间数据库中SDE用户使用探讨
- 转载】ArcSDE空间数据库中SDE用户使用探讨
- ArcSDE空间数据库中SDE用户使用探讨
- ArcSDE空间数据库中SDE用户使用探讨
- ArcSDE空间数据库中SDE用户使用探讨
- 浅谈优化空间数据库的几种方案
- 利用SDE的C API对SQL数据库进行操作
- 欺骗站长的几大友情链接作弊方法
- Introduce to ArcSDE
- VC+MO2.0连接ArcSDE并且读出SDE中的空间数据(三)
- VC+MO2.0连接ArcSDE并且读出SDE中的空间数据(二)
- VC+MO2.0连接ArcSDE并且读出SDE中的空间数据(一)
- VB代码连接ArcSDE的方法总结
- ARCIMS 介绍
- arcIMS配置
- ArcSDE常用操作命令
- 理解ARCIMS-Server、Service和Servlet Engine的区别
- ArcIMS9.2 的元数据服务框架
- 图算法之广度优先搜索