gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15946
  • QQ554730525
  • 铜币25338枚
  • 威望15363点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
阅读:1945回复:9

在Mo中建立本地数据关联和SDE数据关联的方法小议

楼主#
更多 发布于:2004-11-11 08:43
 在mo的开发中,示可以通过Table对象在Maplayer记录集中连接其他各种数据库。mo提供了Active X Data Objects(OLE DB)、Microsoft Jet database engine Database(MDB)和Data Access Objects(DAO)3.5得等多种方法。
1.用OLEDB接口和Access数据库的一个表建立Table对象.通过一下代码我们可以把Access表设置为MO中的table表对象来调用:
Private Sub Command1_Click()
  Dim pTable As MapObjects2.Table  '建立一Mo table表对象
  Dim Str1 As String
  Str1 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + App.Path + "\..\Data.mdb"                      '设置数据源
  Set pTable = New MapObjects2.Table
  pTable.Database = Str1
  pTable.Name = "TableName"         '指定数据表名
  MsgBox pTable.Records.TableDesc.FieldName(0)
End Sub
2.使用AddRelate和RemoveRelate方法
如果要将"本地图层"(非sde表)和数据库中的数据表关联.就要用到AddRelate方法.其语法是
object.AddRelate( toField, sourceTable, fromField,[checkFields as Boolean])
object:对象,一般为Maplayer对象.
toField:Object对象的相关字段
sourceTable:要关联的table表对象.
fromField:Table表中字段.
checkfield:可选,判断是否进行相关检查,默认为True.
(1).Addrelate方法返回一个包含Maplayer的所有记录,其字段为原所有字段加上Table表中的字段和符合的相关数据
(2).除了相关字段外,Table中的字段名应和Maplayer的字段名不同.
一旦建立关联,可以用Object.RemoveRelate删除关联.以下是利用该方法来建立图层与table表的关联实例代码,具体可参考mo的帮助.
  Dim fName As String, dName As String
  Dim pTable As New MapObjects2.Table
  Dim pLayer As MapObjects2.MapLayer
  Dim pFName As String
 ...
 Set pLayer = Map1.Layers(0)  '建立图层对象
 pFName = "FIPS_CODE"    
 ...
 pTable.Database = "dBase IV;DATABASE=" + Str2 '设置数据源
 pTable.Name = "demog"                         'table名
 ...  
 If pLayer.AddRelate(pFName, pTable, pFName, True) Then '如果为True,表名建立        ListLayers                                        '关联成功
 Else
      MsgBox "Failed Relate"
 End If
如果建立成功,Player的数据集就包含了两个表中的相关数据,可以用以下代码来调用.
For Each pFld In player.Records.Fields
    List1.AddItem pFld.Name
Next pFld
2.使用 FilterTables和FilterExpression 建立sde图层的关联
   如果要利用sde图层来建立关联,就必须要使用 FilterTables和FilterExpression
.而且,目前Arcsde8.3仅允许sde图层关联在同一个sde数据库的Table表.
FilterTable语法:
object.FilterTable [= tableNames]
说明:
object:对象,一般为sde图层.
ableNames: 要由Maplayer对象过滤的数据表(也就是通常的关系型数据表的名字
FilterExpression语法:
object.FilterExpression [= filter ]
说明:
object:对象.通常是sde图层.
filter:筛选表达式.
.FilterExpression属性的作用等同于一个SQL查询.
    比如说有一个sde图层"Xinjiang",而sde数据库中还有一个"Population"人口表,记录新疆所有县市某年的人口,两个表的Conty_Name字段是唯一且可以相互关联的.我们的目的要将图层Xinjiang和该人口表做关联,在程序运行时显示图层信息和相应的人口信息.
(1).建立过滤表(过滤表名就是Population)
Dim pStrings As New MapObjects2.Strings
pStrings.Add "SDE.DBO.Population"   '先把表名附给字符串集.
(2).设置过滤表,假设Map1.Layers(0)图层就是sde图层"Xinjiang"
  with  Map1.Layers(0)
   ' Set the FilterTables.
    Set .FilterTables = pStrings     '字符串集附给FilterTables
(3).使用FilterExpression建立表关联
   .FilterExpression = "SDE.DBO.Xinjiang.Conty_Name = SDE.DBO.Population.Conty_Name"
    MsgBox .Records.TableDesc.FieldCount - lFieldCount ; " fields added.", vbInformation, "FilterTable Fields"   '给出提示有多少个新字段被加进来.
我们获取建立关联后的sde图层Map1.Layers(0)的记录集.读出其中的字段和记录:
 For Each fld In ReCs.Fields  ' iterate over the fields
     List2.AddItem fld.Name ; vbTab ; fld.ValueAsString
 Next fld
总结:mo可以连接多种数据库的多种方法.如果要建立关联一定先弄清楚要使用哪种方法,而且麻烦的是,这些方法并不都是通用的.比如说,如果要利用sde图层来建立关联,就必须要使用FilterTables和FilterExpression.虽然在Mo的AddRelate帮助中有利用AddRelate方法建立sde数据表的关联的例子.但使用该例子会发现虽然也可以建立sde图层的关联(addRelate返回True)但记录值始终为空.AddRelate的这个sde关联例子写的实在是误导!!!建立sde图层关联必须使用FilterTables和FilterExpression.
喜欢0 评分0
袁绍伦
路人甲
路人甲
  • 注册日期2003-08-08
  • 发帖数654
  • QQ164646905
  • 铜币1336枚
  • 威望0点
  • 贡献值0点
  • 银元0个
1楼#
发布于:2004-11-13 09:23
<P>好东西居然没有人顶!我来!</P>
愿意和大家交朋友! QQ:47559983 MSN:shaolun_yuan@hotmail.com eMail:shaolun-yuan@163.com
举报 回复(0) 喜欢(0)     评分
chaimin1400
路人甲
路人甲
  • 注册日期2003-10-11
  • 发帖数315
  • QQ
  • 铜币533枚
  • 威望0点
  • 贡献值0点
  • 银元0个
2楼#
发布于:2004-11-13 10:12
<P>呵呵 </P><P>好东西我先copy下来</P><img src="images/post/smile/dvbbs/em01.gif" />
举报 回复(0) 喜欢(0)     评分
lixaokui
路人甲
路人甲
  • 注册日期2003-12-25
  • 发帖数768
  • QQ28796446
  • 铜币27枚
  • 威望0点
  • 贡献值0点
  • 银元0个
3楼#
发布于:2004-11-15 11:52
<img src="images/post/smile/dvbbs/em01.gif" /><img src="images/post/smile/dvbbs/em01.gif" /><img src="images/post/smile/dvbbs/em01.gif" /><img src="images/post/smile/dvbbs/em01.gif" />
西门吹血,有了鼓风机,就不用吹啦!
举报 回复(0) 喜欢(0)     评分
cher0731
路人甲
路人甲
  • 注册日期2004-10-28
  • 发帖数40
  • QQ
  • 铜币189枚
  • 威望0点
  • 贡献值0点
  • 银元0个
4楼#
发布于:2004-11-15 20:01
<P>经典,偶谢了</P><P>偶先考了再说!</P><img src="images/post/smile/dvbbs/em01.gif" />
举报 回复(0) 喜欢(0)     评分
闲云野鹤-nx
路人甲
路人甲
  • 注册日期2004-11-16
  • 发帖数9
  • QQ
  • 铜币127枚
  • 威望0点
  • 贡献值0点
  • 银元0个
5楼#
发布于:2004-11-22 11:06
<P>谢谢!好东西呀,希望大家多来点类似的交流!</P>
举报 回复(0) 喜欢(0)     评分
berush
路人甲
路人甲
  • 注册日期2003-12-01
  • 发帖数158
  • QQ
  • 铜币622枚
  • 威望0点
  • 贡献值0点
  • 银元0个
6楼#
发布于:2004-11-22 20:06
<P>好贴~</P><P>但是有一问题:</P><P>(2).设置过滤表,假设Map1.Layers(0)图层就是sde图层"Xinjiang"
  with  Map1.Layers(0)
   ' Set the FilterTables.
    Set .FilterTables = pStrings     '字符串集附给FilterTables
</P><P>通过.FilterTables进行关联,但是并不知道是用<b><FONT color=#ff0000>两个表中的哪个字段</FONT></b>进行关联啊.然倒是默认的字段</P>
举报 回复(0) 喜欢(0)     评分
fnwgz
伴读书童
伴读书童
  • 注册日期2004-09-16
  • 发帖数120
  • QQ
  • 铜币638枚
  • 威望0点
  • 贡献值0点
  • 银元0个
7楼#
发布于:2004-12-29 00:03
顶<img src="images/post/smile/dvbbs/em01.gif" />
我也许很笨,但是我一直再努力,没有放弃!
举报 回复(0) 喜欢(0)     评分
blaster
路人甲
路人甲
  • 注册日期2005-02-22
  • 发帖数153
  • QQ
  • 铜币486枚
  • 威望0点
  • 贡献值0点
  • 银元0个
8楼#
发布于:2005-03-16 13:01
好东西  非常感谢 !
举报 回复(0) 喜欢(0)     评分
nxy_918
路人甲
路人甲
  • 注册日期2003-09-15
  • 发帖数74
  • QQ
  • 铜币325枚
  • 威望0点
  • 贡献值0点
  • 银元0个
9楼#
发布于:2005-03-16 17:09
楼主真强人,佩服ing
举报 回复(0) 喜欢(0)     评分
游客

返回顶部