关于同步复制中Check in/out的再次研究,还是有许多收获。
基本的使用方法可以参考:http://blog.csdn.net/linghe301/article/details/6093368
基本的使用方法(ArcGIS10环境下)
1:如果是一次性的CheckIn/out(也就是说签出的GDB,编辑一次再签入回去,文件GDB就和数据库没有任何关系了)
ArcSDE源数据可以为注册版本,也可以不为注册版本
a:为注册版本数据,在签出过程中会给用户建立一个replica的名字,其实这个名字也就是在版本数据的一个子版本名称,我们编辑好的GDB导入进去,其实也就是把数据导入到这个子版本中了,但是我们在导入过程中还有一个这样的选项,Reconcile and post with the parent version的勾选项。
如果我们不勾选这个,我们的数据就会在子版本中,用户自己再核对数据进行协调,提交,这等于是给用户一个检查新数据的机会。
如果我们勾选这个,那么我们的数据会自动的进行协调提交到Default版本中,而且子版本的名称会被自动删除掉。
b:非注册版本(ArcGIS10的新特性),那么我们进行签入数据时就直接签入到Default版本了。
2:上面的链接我们也说明了,因为我们的数据不可能老是进行一次性签出(如果数据量小还可以),数据量大的话,我们每次签出肯定会浪费很多时间,所以我们也设计了可以对已经签出的GDB进行多次再建立同步关系(也就是勾选Register existing data only),但是使用这个选项有个前提
-----------------------------------------------------------------------------------------------
下面看看关于数据库里面的东西
1:在SDE库中,我们在GDB_ITEMS表中查看复本的信息
select sde.sdexmltotext(xml_doc ) from sde_xml_doc1 where sde_xml_id=(select definition from gdb_items where name='MyCheckOut')2:我们看一下关于SDE里面MyCheckOut对象的XM L信息(这些信息在博客中显示效果不好,大家有兴趣可以复制这些信息保存为.xml在IE中打开,效果更佳。
<?xml version="1.0"?> -<GPReplica xmlns:typens="http://www.esri.com/schemas/ArcGIS/10.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="typens:GPReplica"><Name>TEST.MyCheckOut</Name><ID>-1</ID><ReplicaVersion>MyCheckOut</ReplicaVersion><CreationDate>2011-07-22T09:09:36</CreationDate><GUID>{CBA4A7FE-BB11-4ED3-A6DE-50E078929907}</GUID><Role>esriReplicaRoleParent</Role><AccessType>esriReplicaAccessNone</AccessType><MyGenerationNumber>0</MyGenerationNumber><SibGenerationNumber>0</SibGenerationNumber><SibMyGenerationNumber>0</SibMyGenerationNumber><ReplicaState>esriReplicaStateWaitingForData</ReplicaState>-<GPReplicaDescription xsi:type="typens:GPReplicaDescription"><ModelType>esriModelTypeFullGeodatabase</ModelType><SingleGeneration>true</SingleGeneration><SpatialRelation>esriSpatialRelIntersects</SpatialRelation>-<QueryGeometry xsi:type="typens:EnvelopeN"><XMin>46.324944999953772</XMin><YMin>17.747347013925921</YMin><XMax>60.247755000414337</XMax><YMax>33.797252986679077</YMax>-<SpatialReference xsi:type="typens:ProjectedCoordinateSystem"><WKT>PROJCS["Xian_1980_3_Degree_GK_CM_111E",GEOGCS["GCS_Xian_1980",DATUM["D_Xian_1980",SPHEROID["Xian_1980",6378140.0,298.257]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Gauss_Kruger"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",111.45],PARAMETER["Scale_Factor",1.0],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]</WKT><XOrigin>-5123200</XOrigin><YOrigin>-10002100</YOrigin><XYScale>450265407.00157917</XYScale><ZOrigin>0</ZOrigin><ZScale>1</ZScale><MOrigin>-100000</MOrigin><MScale>10000</MScale><XYTolerance>0.001</XYTolerance><ZTolerance>2</ZTolerance><MTolerance>0.001</MTolerance><HighPrecision>true</HighPrecision></SpatialReference></QueryGeometry>-<GPReplicaDatasets xsi:type="typens:ArrayOfGPReplicaDataset">-<GPReplicaDataset xsi:type="typens:GPReplicaDataset"><DatasetName>TEST.TESTPOLYGON</DatasetName><DatasetType>esriDTFeatureClass</DatasetType><RowsType>esriRowsTypeFilter</RowsType><IsPrivate>false</IsPrivate><UseGeometry>true</UseGeometry><TargetName>TESTPOLYGON</TargetName><DatasetID>1623</DatasetID><ParentOwner>TEST</ParentOwner></GPReplicaDataset></GPReplicaDatasets><TransferRelatedObjects>true</TransferRelatedObjects></GPReplicaDescription><ReconcilePolicy>esriReplicaDetectConflicts</ReconcilePolicy></GPReplica>我们重点看着几个子项
<ReplicaState>esriReplicaStateWaitingForData</ReplicaState> <ModelType>esriModelTypeFullGeodatabase</ModelType> <SpatialRelation>esriSpatialRelIntersects</SpatialRelation> <DatasetName>TEST.TESTPOLYGON</DatasetName>
3:我们看一下MDB里面的MyCheckOut对象的XML信息
<?xml version="1.0"?> -<GPReplica xmlns:typens="http://www.esri.com/schemas/ArcGIS/10.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="typens:GPReplica"><Name>MyCheckOut</Name><ID>-1</ID><ReplicaVersion>MyCheckOut</ReplicaVersion><CreationDate>2011-07-22T09:09:36</CreationDate><GUID>{CBA4A7FE-BB11-4ED3-A6DE-50E078929907}</GUID><Role>esriReplicaRoleChild</Role><AccessType>esriReplicaAccessNone</AccessType><MyGenerationNumber>0</MyGenerationNumber><SibGenerationNumber>0</SibGenerationNumber><SibMyGenerationNumber>0</SibMyGenerationNumber><ReplicaState>esriReplicaStateSendingData</ReplicaState><SibConnectionString>ENCRYPTED_PASSWORD=0002b8653fdbb58d7a2be38905c1675a00;SERVER=lish;INSTANCE=5151;USER=test;VERSION=SDE.DEFAULT;AUTHENTICATION_MODE=DBMS;ProgID=esriDataSourcesGDB.SdeWorkspaceFactory.1</SibConnectionString>-<GPReplicaDescription xsi:type="typens:GPReplicaDescription"><ModelType>esriModelTypeFullGeodatabase</ModelType><SingleGeneration>true</SingleGeneration><SpatialRelation>esriSpatialRelIntersects</SpatialRelation>-<QueryGeometry xsi:type="typens:EnvelopeN"><XMin>46.324944999953772</XMin><YMin>17.747347013925921</YMin><XMax>60.247755000414337</XMax><YMax>33.797252986679077</YMax>-<SpatialReference xsi:type="typens:ProjectedCoordinateSystem"><WKT>PROJCS["Xian_1980_3_Degree_GK_CM_111E",GEOGCS["GCS_Xian_1980",DATUM["D_Xian_1980",SPHEROID["Xian_1980",6378140.0,298.257]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Gauss_Kruger"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",111.45],PARAMETER["Scale_Factor",1.0],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]</WKT><XOrigin>-5123200</XOrigin><YOrigin>-10002100</YOrigin><XYScale>450265407.00157917</XYScale><ZOrigin>0</ZOrigin><ZScale>1</ZScale><MOrigin>-100000</MOrigin><MScale>10000</MScale><XYTolerance>0.001</XYTolerance><ZTolerance>2</ZTolerance><MTolerance>0.001</MTolerance><HighPrecision>true</HighPrecision></SpatialReference></QueryGeometry>-<GPReplicaDatasets xsi:type="typens:ArrayOfGPReplicaDataset">-<GPReplicaDataset xsi:type="typens:GPReplicaDataset"><DatasetName>TESTPOLYGON</DatasetName><DatasetType>esriDTFeatureClass</DatasetType><RowsType>esriRowsTypeFilter</RowsType><IsPrivate>false</IsPrivate><UseGeometry>true</UseGeometry><TargetName>TEST.TESTPOLYGON</TargetName><DatasetID>3</DatasetID><ParentOwner>TEST</ParentOwner></GPReplicaDataset></GPReplicaDatasets><TransferRelatedObjects>true</TransferRelatedObjects></GPReplicaDescription><ReconcilePolicy>esriReplicaDetectConflicts</ReconcilePolicy></GPReplica>我们也看重点的几项
<ReplicaState>esriReplicaStateSendingData</ReplicaState> <SibConnectionString>ENCRYPTED_PASSWORD=0002b8653fdbb58d7a2be38905c1675a00;SERVER=lish;INSTANCE=5151;USER=test;VERSION=SDE.DEFAULT;AUTHENTICATION_MODE=DBMS;ProgID=esriDataSourcesGDB.SdeWorkspaceFactory.1</SibConnectionString> <ModelType>esriModelTypeFullGeodatabase</ModelType> <SpatialRelation>esriSpatialRelIntersects</SpatialRelation>他们之间的关系就是通过这些信息进行相关联的
----------------------------------------------------------------------------
关于修改数据的研究
我们进行了四种操作,增加一个ObjectID为10要素,删除ObjectID=4的要去,合并ObjectID=1和8的要素,分割ObjectID=5的要素
我们可以在Personal GDB里面有一个名叫
ClassID | DatasetType | State | ObjectID |
---|---|---|---|
3 | 5 | 2 | 8 |
3 | 5 | 2 | 4 |
3 | 5 | 0 | 9 |
3 | 5 | 0 | 10 |
3 | 5 | 1 | 1 |
3 | 5 | 1 | 5 |
这个表就是记录我们数据更改的表,ClassID和DatasetType是区分不同要素类和类型的,最主要的我们看一下State和ObjectID
关于这个State的枚举值,我还没有找到相关的资料,但是我们根据相关的要素变化可以推测出来
State=2代表删除
State=0代表新建
State=1代表修改
当我们修改的MDB导入时,应该是重点针对这个表进行的数据修改吧,有状态值来获得到底是增、删、改,还有对应的ObjectID,这样就可以将编辑好的数据同步过来了。
------------------------------------------------------------------------------
等你编辑好的GDB信息同步到ArcSDE数据库中后,我们可以看到这个GDB里面的GDB_ReplicaChanges这个表以及GDB_ITEMS的Relica信息已经没有了,也就是说ArcSDE库与这个GDB已经没有任何关系了。