在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.