BizTalk -->

by muyanpeng

导航

BizTalk 关于SQL Adapter的动态绑定

Posted on 2008-01-04 11:14  穆彦鹏  阅读(2513)  评论(4编辑  收藏  举报
BizTalk 关于SQL Adapter的动态绑定

最近工作中客户需要实现一个动态绑定的端口,希望可以动态的绑定SQL Adapter的一些信息.服务器"身份验证"数据库名称"等等.

所以这里就需要SQL的一个动态绑定.

在前期调研的时候,看到文档里有明确的说明SQL Adapter是可以动态绑定的,而且在生成一个动态绑定端口并启动它的时候,是可以看到它与SQL Adapter之间的订阅关系(如图).
所以给出的结论就是SQL Adapter是可以动态绑定的.

 

而当实际去操作开发的时候却遇到了问题,因为SQL Adapter不同于File Adapter 或者SMTP Adapter ,因为一个Adapter如需在输出时动态绑定,必须指定相关属性,例如:

Port_Person_Out(Microsoft.XLANGs.BaseTypes.Address) = "ftp://ftpserver.com";
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 的动态绑定的,为了证明生成的订阅是有效的,我做了如下试验:

看一下流程:

  

 

我根据数据库中一张表生成了一个insertschema,然后将port_2设置成动态绑定的,在构造insertmessage的时候将传入参数的address信息当作动态绑定端口的Microsoft.XLANGs.BaseTypes.Address属性.

其实我这里只是在Microsoft.XLANGs.BaseTypes.Address 属性上告诉biztalk 我要用sql的适配器,而并没有告诉biztalk 

Connection string

Namespace

Response element root name

这三个属性,所以如果只做到这里肯定是不行的!

所以我要找到一个配置这三个属性的地方,而Microsoft.BizTalk.GlobalPropertySchemas.dll又没有sql的相关信息,貌似到这里就不可以在做下去了。后来我又找到另一个位置:



 

我在这里将NamespaceResponse element root name 写死,但是我没有写Connection string 因为我是要进行一个动态插入不同数据库的试验。

这里Connection string 不写是可行的,因为动态绑定的URI 是这样的:SQL://localhost/ChinaDigitalPOC/ 它可以指示到数据库,而默认的认证方式是基于windows的。所以connection string在这里是可以暂时忽略。

这里明确一个概念:我将SQL Adapter的属性赋予了默认值,这样所有host上的SQL Adapter在使用的时候都有一个默认值了,但如果是静态端口,配置时配置的属性会覆盖默认值的属性。

部署工程,配置工程也基本上OK了,看一下我将要处理的两个数据库:

 

两个库:不同名字,具有相同的表,该表具有相同表结构。
我现在要做的是构造两个输入消息:将address指向不同的数据:

<ns0:Root xmlns:ns0="http://Test_BizTalk_Server_Project.Schema1">
 
<address>SQL://localhost/ChinaDigitalPOC/</address> 
  
<fullname>56</fullname> 
  
<phone>56</phone> 
  
<fax>56</fax> 
</ns0:Root>

<ns0:Root xmlns:ns0="http://Test_BizTalk_Server_Project.Schema1">
  
<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,一种可能是故意不暴露该接口。