最近工作中客户需要实现一个动态绑定的端口,希望可以动态的绑定SQL Adapter的一些信息.服务器"身份验证"数据库名称"等等.
所以这里就需要SQL的一个动态绑定.
在前期调研的时候,看到文档里有明确的说明SQL Adapter是可以动态绑定的,而且在生成一个动态绑定端口并启动它的时候,是可以看到它与SQL Adapter之间的订阅关系(如图).
所以给出的结论就是SQL Adapter是可以动态绑定的.
而当实际去操作开发的时候却遇到了问题,因为SQL Adapter不同于File Adapter 或者SMTP Adapter ,因为一个Adapter如需在输出时动态绑定,必须指定相关属性,例如:
OutFtpMsg(FTP.UserName) = " username ";
OutFtpMsg(FTP.Password) = " password ";
这里的 FTP.UserName 就是FTP Adapter的属性,而SQL在应该输入属性的地方却找不到SQL的相关信息.
后又发现这个并不是SQL Adapter的问题,也不是注册SQL Adapter的注册表文件的问题,而是Microsoft.BizTalk.GlobalPropertySchemas.dll的问题,目前我安装的BizTalk 2006 R2的这个dll的版本是3.0.1.0,看一下它的对象浏览结果:
有部分adapter的相关属性配置好空间,但是没有sql的,我怀疑是出于某种考虑sql adapter的属性配置被私有化了,所以外部不可见。再或者是Microsoft.BizTalk.GlobalPropertySchemas.dll 有问题,版本应该没有问题,因为WCF 已经都存在了,但是为什么没有SQL ? 暂且怀疑是BizTalk的一个BUG .
分析暂且分析到这里。。。
为了验证SQL Adapter是的确支持动态绑定的,为了证明BizTalk在底层处理是支持SQL 的动态绑定的,为了证明生成的订阅是有效的,我做了如下试验:
看一下流程:
我根据数据库中一张表生成了一个insert的schema,然后将port_2设置成动态绑定的,在构造insert的message的时候将传入参数的address信息当作动态绑定端口的Microsoft.XLANGs.BaseTypes.Address属性.
其实我这里只是在Microsoft.XLANGs.BaseTypes.Address 属性上告诉biztalk 我要用sql的适配器,而并没有告诉biztalk
Connection string
Namespace
Response element root name
这三个属性,所以如果只做到这里肯定是不行的!
所以我要找到一个配置这三个属性的地方,而Microsoft.BizTalk.GlobalPropertySchemas.dll又没有sql的相关信息,貌似到这里就不可以在做下去了。后来我又找到另一个位置:
我在这里将Namespace、Response element root name 写死,但是我没有写Connection string 因为我是要进行一个动态插入不同数据库的试验。
这里Connection string 不写是可行的,因为动态绑定的URI 是这样的:SQL://localhost/ChinaDigitalPOC/ 它可以指示到数据库,而默认的认证方式是基于windows的。所以connection string在这里是可以暂时忽略。
这里明确一个概念:我将SQL Adapter的属性赋予了默认值,这样所有host上的SQL Adapter在使用的时候都有一个默认值了,但如果是静态端口,配置时配置的属性会覆盖默认值的属性。
部署工程,配置工程也基本上OK了,看一下我将要处理的两个数据库:
两个库:不同名字,具有相同的表,该表具有相同表结构。
我现在要做的是构造两个输入消息:将address指向不同的数据:
<address>SQL://localhost/ChinaDigitalPOC/</address>
<fullname>56</fullname>
<phone>56</phone>
<fax>56</fax>
</ns0:Root>
<address>SQL://localhost/ChinaDigitalPOC_1/</address>
<fullname>56</fullname>
<phone>56</phone>
<fax>56</fax>
</ns0:Root>
传入到流程里面,测试得到结果:
OK 动态将数据输入到两个库 没有任何问题。
通过以上试验,我得到的结论是:目前的sql adapter是绝对支持动态 绑定的,但是在开发所依赖的Microsoft.BizTalk.GlobalPropertySchemas.dll是有问题的,一种可能是BUG,一种可能是故意不暴露该接口。