none
关于sql adapter一次更新多条记录的问题 RRS feed

答案

  • Biztalk里面可以写代码?这里没有环境,无法给你截图
    2008年9月27日 9:20
  • 把要更新的多条消息转成类似下面这样的形式,发送到sql端口:

    <ns0:RequestRoot xmlns:ns0="http://SqlTest">

    <ns0Tongue Tiedync>

    <ns0:before>

    <ns0:Agents AgentID="Agnt1" />

    </ns0:before>

    <ns0:after>

    <ns0:Agents AgentID="Agnt1" FirstName="FirstName_1" LastName="LastName_2" RegionID="RegionID_3" />

         </ns0:after>

    <ns0:before>

    <ns0:Agents AgentID="Agnt2" />

    </ns0:before>

    <ns0:after>

    <ns0:Agents AgentID="Agnt2" FirstName="FirstName_2" LastName="LastName_3" RegionID="RegionID_4" />

         </ns0:after>

          <!-- 其它记录 -->

    </ns0Tongue Tiedync>

    </ns0:RequestRoot>

    2008年9月27日 9:26

全部回复

  • 使用 DataAdapter 更新数据源

    http://msdn.microsoft.com/zh-cn/library/33y2221y(VS.80).aspx


    使用 DataAdapter 执行批量更新

    http://msdn.microsoft.com/zh-cn/library/kbbwt18a(VS.80).aspx
    2008年9月27日 9:04
  • 非常感谢你的回复,能否告之如何在biztalk中实现吗?谢谢

    2008年9月27日 9:14
  • Biztalk里面可以写代码?这里没有环境,无法给你截图
    2008年9月27日 9:20
  • 把要更新的多条消息转成类似下面这样的形式,发送到sql端口:

    <ns0:RequestRoot xmlns:ns0="http://SqlTest">

    <ns0Tongue Tiedync>

    <ns0:before>

    <ns0:Agents AgentID="Agnt1" />

    </ns0:before>

    <ns0:after>

    <ns0:Agents AgentID="Agnt1" FirstName="FirstName_1" LastName="LastName_2" RegionID="RegionID_3" />

         </ns0:after>

    <ns0:before>

    <ns0:Agents AgentID="Agnt2" />

    </ns0:before>

    <ns0:after>

    <ns0:Agents AgentID="Agnt2" FirstName="FirstName_2" LastName="LastName_3" RegionID="RegionID_4" />

         </ns0:after>

          <!-- 其它记录 -->

    </ns0Tongue Tiedync>

    </ns0:RequestRoot>

    2008年9月27日 9:26
  • 有办法把多条消息先收集起来再转换成这种格式吗?

    2008年9月28日 1:52
  • 可以,不过要分情况,看你的消息源是什么样的,下面说两种情况:
    1、如果是直接从一个数据库源进来的消息,本身就可以是一个biztalk消息包含了多条记录的。直接把这样的消息通过mapping转成相应的updategram的消息即可。
    2、如果是单个单个的消息分别进入到biztalk接收端口的,又需要按照一定的规则把这些消息合并为一个消息。这种情况可以使用biztalk的Sequential Convoys功能,就是一个orchestrator接收同类型的多条消息,第一条消息激活一个orchestrator实例,后续的消息都是被这个已激活的orchestrator实例接收。在orchestrator实例中合并每次接收来的消息。
    关于Sequential Convoys,可以参考文章深入biztalk的Sequential Convoys保护
    2008年9月28日 2:13
  • 非常感谢kent的回复,我们的业务需求是这样的。通过biztalk实现中心库和业务数据库数据的同步,也就是说当业务数据库中数据出现变化时,能通过biztalk增量同步到中心库进行相应的更新。第一次用biztalk实现这样的功能,现在我把我们的解决方案说一下,请kent多多指正

    我们先是在业务数据库中建立一张流水表,其它表的增量数据都通过触发器写到流水表。流水表主要有以下字段(id,colval,keyval,operatetype,createtime,tablename...),colval存放记录数据信息,以##分割,keyval存放键值。biztalk端根据数据更改时间定时抽取流水表的数据实现更新。以前的实现方式是把抽取过来的数据先进行拆分,然后一条一条的处理更新。后来测试的时候发现速度太慢了,所以想到还是要批量更新才行.但是分析发现拆分还是必须进行的,因为得判断对中心库的表执行何种操作。现在的问题就回到了我上面问的那个问题,怎样把拆分以后的消息再组装成上面批量更新的目标消息格式。Sequential Convoys可能是解决之道,我先去看下。

    我想知道有没有更好的增量同步方案,或者我们的方案是否合理,谢谢!

    2008年9月28日 2:39
  • 看你的流水表里有tablename,是不是源数据库的任意表的更改都需要同步?
    如果是的话,用updategram更新数据库就不太现实了,因为updategram消息的schema中含有需要更新的表名字段名等,如果用updategram,每张数据表就需要一个用于updategram的schema。
    我觉得还不如直接用存储过程,把流水表的每条记录直接发送到目前数据库存储过程,由存储过程根据流水表记录内容去做处理。
     
    另外,如果这部分只是做数据同步,我觉得没必要用biztalk做这个数据传送的工作,用SSIS等ETL工具应该更合适。
    2008年9月28日 2:58
  • 是的,任何表的更改都需要同步。biztalk是甲方买的产品,花了大价钱的,说是有人这样用过,所以没法,我们只能用biztalk。很麻烦,以前一条一条的处理已经搞的很复杂了,很多个表,多个分支,现在为了提高效率(以前增量更新的时候,基本上是1条/1s,确实很慢),所以改用批量处理。目前看来肯定是得用biztalk来实现了,我想知道这样做是否能实现,再复杂也得硬着头皮上了。另外刚才我看了你的文章,感觉好象用不上sequential convoy。

    2008年9月28日 3:12
  • 如果一定要biztalk做的话,用updategram去更新数据显然不合适,原因前面的帖子里说了,目标数据库应该用存储过程来处理流水表的数据。
    为了加快处理速度,可以用下面的方案:
    从源数据库中读取流水表,可能有多条记录进入到orchestration,然后在orchestration拆分为一条条记录的消息,然后一条条的把消息送到目标数据库的存储过程,存储过程的功能就是处理流水表里的每条记录。
    这样,多条消息还是在一个orchestration实例中得到了处理。
    至于如何在orchestration里拆分消息,可以在orchestration里执行带有envolope的xml接收管道来拆分消息。
    2008年9月28日 3:24
  • 非常感谢kent的回复,对于把消息发到存储过程处理,我不是很明白是什么意思,能说的详细点吗?还有,在流程中执行带有envolope的xml接收管道来拆分消息,这种拆分的方式能否提示一下,有相关文章吗?

    2008年9月28日 3:34
  • 1、目标数据库存储过程的参数接收你源数据库中的流水表的一条记录的数据,存储过程根据这些参数根据不同的操作类型,不同的表,还有相关字段的值,去做不同的动作更新目标数据库的内容。
    2、关于流程中执行xml接收管道的相关信息,请参看biztalk帮助文档:
    2008年9月28日 4:01