zoukankan      html  css  js  c++  java
  • geodatabase版本化更新

    新建一个geodatabase数据库

    版本化之后。。

    让我们看一下Axx表和Dxx表的结构

    A表会继承要素类同名表(以下简称Base表)的所有字段和类型信息,而且会添加一个SDE_STATE_ID的整型字段,主要记录每一个编辑操作的状态ID。D表中有三个字段:DELETE_AT记录删除的状态信息、SDE_DELETES_ROW_ID记录删除数据对应的ObjectID、SDE_STATE_ID记录。如果删除的数据是版本化之后新增的数据,可以通过该记录找到相关的详细信息来进行删除,所以D表通过这三个字段的信息就可以精确定位来删除数据信息。

    3. 更新数据

    如图3-23所示,当用户进行数据更新的编辑行为时,录入并修改一下ObjectID为2的图形,其实就是先删除一个ObjectID为2再创建一个ObjectID为2的新要素。所以在D表中存储删除的信息,在A表中存储新增的信息,而且A表中状态值与D表中的状态值是一致的,表明是一个更新操作。

    [提问:SDE_STATE_ID与OBJECTID的区别和联系是?SDE_STATE_ID是跟ObjectID很像的,但是只有在ObjectID代表的对象进行操作时才会产生(操作包括:增删改)。]

    更新:先删除ObjectID=2,再添加ObjectID=2,只不过修改其中的一个属性。。它的SDE_STATE_ID会发生改变,所以说它其实不是固定不变的。这个状态码是会在发生修改时而递增的,每发生一次,就会递增一次

     

     原来ObjectID=2的状态码为0,进行了一次更新之后它的状态码变成27507...

    那么删除ObjectID=5的对象时,SDE_STATE_ID为0,代表原来的SDE_STATE_ID为0,但是DELETED_AT跟SDE_STATE_ID不同代表当下它的SDE_STATE_ID变了

    ADD表跟DELETE表之间根据SDE_STATE_ID关联,而并非根据ObjectID=DELETS_ROW_ID关联。

    所以,一共有三种可能:(1)只有Add,没有delete(2)只有Delete,没有Add(3)现有Delete,又有Add(表示Update)

    将原表和A表和D表进行关联,即可得到当前视图。。

    那么如果更新了原表的一个属性,那么会在当前视图显示吗?如果不显示,是不是要删除当前视图,重新生成。。不够,还得把A表和D表都一起删除才行。因为有可能它的这个属性已经经过一轮或多轮的更新,原表该属性早已不能显示在视图中了

    例如,查看A74和D74,会发现,ObjectID=1的对象曾经经历过两次更新,

    select * from databasename 

    select * from databasename 

     

     删除前是930,删除后是932

    select * from databasename

    可以看到,更新过两次,当时好像是版本化以后又进行了更新,比如Status。。由0改为5等等。

    总结一下,为什么修改原表却在视图里无法实时显示(我找到原表更新视图不变的原因)原因就是:因为一旦版本化发布服务之后再进行更新的话会产生一个A表,优先显示A表,覆盖掉了原表。。所以,只要发布服务之后更新过一次再更新原表便无法在显示。因为,更新一条数据=删除原数据+添加新数据,所以一旦修改,原表这条数据就失效了。因为“删除”和“添加”都是全新的表,放在不同的表里。。

    解决方法:

    (1)删除D表和A表,重新生成视图。。前提是。。要先把当前视图保存起来。不然会丢失之前所有的努力

    (2)遵从arcgis更新原则,分别在D表和A表中进行修改

  • 相关阅读:
    C++内联函数
    C++类中创建线程
    windows下搭建Redis集群
    tcpdump截帧工具使用
    使用gdb调试应用程序
    工作之用
    primecoin服务常用命令和参数说明
    Windows mysql默认字符集修改
    primecoin在ubuntu16.04上部署服务:
    ubuntu磁盘分配和挂载
  • 原文地址:https://www.cnblogs.com/2008nmj/p/15118696.html
Copyright © 2011-2022 走看看