NPPYQ的学习笔记

每天进步一点点

导航

BizTalk更新Null值问题 (续前)

前一篇文章分析了该问题,同时一些解决的手动替代方法.以下为其他的非手动方法.文章连接:极度震惊--BizTalk不支持Null值更新.

问题描述:

BizTalk数据交换,中间以xml形式进行消息映射转换传输,发往适配器进行操作.

而SqlServer导出的Schema,其表字段对应的节点并非Element,而是Attribute.

如果某个字段为NULL,产生的xml中,该Record中对应的Attribute即不出现.

导致映射出去的对应架构消息Element或Attribute也不出现,即无法更新目标.

例如,源表(SqlServer)某个记录的某字段为NULL,对应目标表字段为非NULL,进行交换后,如果是更新操作,则无法更新,目标表仍然为原来的值,而非NULL.

解决方法:

1.防止更新操作出现,比如先删再插.

2.替代NULL,比如字符为空,数值为0等.

已用方法:

现在项目中用的方法为第二种,源表中如果有NULL的出现,一律换成空,数值型暂时不换.

由于采集使用流水,每次变更的记录都触发采集到一张表中,所以源表可以有NULL存在,在触发器往流水表中插入数据时,将NULL替换成空,即''.

另外方法:

Schema对应的节点该Attribute,有一个属性为Use RequireMent,默认为Optional,即可选的.该成Required后,该Attribute在xml消息中必须存在.因此在生成xml时候,字段将字符型为'',数值型为0.测试了Varchar和int,其他未测试.

测试发现,只有映射的源设置该属性才行,只设置目标架构的Use RequireMent不能起到应有的作用.

如图:

其他:

Oracle的架构,表的字段在导出的Schema中,对应的为Element,有一个属性为Nillable,估计也能实现Oracle对应的功能,最近太忙,未测试.

如图:

总结:

该功能实现的发现,是偶尔看下BTS的参考文档发现的,看来有时候真的不要去网上找太细的问题,基本没有,只有靠自己去摸索了.

posted on 2008-06-17 16:30  NPPYQ  阅读(542)  评论(0编辑  收藏  举报