BizTalk -->

by muyanpeng
posts - 12, comments - 62, trackbacks - 0, articles - 1

BizTalk 关于SQL Adapter的动态绑定

Posted on 2008-01-04 11:14 穆彦鹏 阅读(1712) 评论(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,一种可能是故意不暴露该接口。



 

Feedback

#1楼    回复  引用  查看    

2008-01-05 15:16 by chnking      
首先向木头同志的探索精神致敬!

今天仔细的查阅了一下biztalk的文档,文档中有biztalk本地所有adapter所涉及的Context Properties 列表:
BizTalk Message Queuing Adapter Property Schema and Properties
File Adapter Property Schema and Properties
FTP Adapter Property Schema and Properties
HTTP Adapter Property Schema and Properties
MSMQ Adapter Property Schema and Properties
SMTP Adapter Property Schema and Properties
SOAP Adapter Property Schema and Properties
BizTalk Framework Schema and Properties
MQSeries Adapter Properties
POP3 Adapter Property Schema and Properties
Windows SharePoint Services Adapter Properties Reference
MIME/SMIME Property Schema and Properties
XML and Flat File Property Schema and Properties
SQL Adapter Configuration Properties
Base EDI Adapter Configuration Properties

发现一些测试过能作为动态端口的那些adaper在文档里都是“Property Schema and Properties ”,而SQL Adapter只有“Configuration Properties ”。这是否表示SQL Adapter就没有定义属性架构。
前两天咱们在biztalk的那些dll中找SQL Adapter的Context Properties 一直没有找到,这也进一步证明SQL Adapter可能没有定义属性架构。

动态端口是通过给消息升级跟相应adapter相关的property field来传送适配器配置的,如果没有属性架构就不可能传送这些配置也就无从配置适配器了。

至于可以用Port_Person_Out(Microsoft.XLANGs.BaseTypes.Address) = "ftp://ftpserver.com";指定使用什么适配器和适配器的URI,是因为给动态端口的Address赋值会被升级到消息的两个biztalk的本身系统属性:BTS.OutboundTransportType(决定使用何种适配器)和BTS.OutboundTransportLocation(决定消息发送到的URI)

#2楼 [楼主]   回复  引用  查看    

2008-01-06 21:32 by 穆彦鹏      
感谢chnking的在我试验时的帮助和建议 !

认真阅读了你的评论,并且深表同意.也从理论上加深了认识 ;) 谢谢

#3楼    回复  引用    

2008-06-23 14:14 by roger011 [未注册用户]
“因为动态绑定的URI 是这样的:SQL://localhost/ChinaDigitalPOC/ 它可以指示到数据库,而默认的认证方式是基于windows的。所以connection string在这里是可以暂时忽略。”
如果不是windows认证,用户名密码等如何在SQL:中表现?

#4楼 [楼主]   回复  引用  查看    

2008-06-23 14:40 by 穆彦鹏      
@roger011
应该说是无法表现 ;(

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  博客园首页

  新闻频道

  社区

  小组

  博问

  网摘

  闪存

  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      


相关链接: