接触biztalk时间不长,转载一篇学习教程:
http://www.cnblogs.com/chnking/archive/2010/05/09/1731098.html

chnking写的。

一、 使用WCF_SQL、WCF_Oracle、WCF_SAP adapter的公共安装前提

1、 Microsoft .NET Framework 3.5 SP1.

2、 Microsoft Visual Studio 2008

3、 安装WCF LOB Adapter SDK SP2

要在VS2008中使用BizTalk Adapter Pack 2.0中的适配器开发biztalk项目,必须在安装WCF LOB SDK时选择安装BizTalk add-in for Visual Studio。要安装此add-in,必须使用定制安装或完全安装WCF LOB Adapter SDK。

在定制安装的选项中,选择BizTalk Server Addin。并且在安装WCF LOB Adapter SDK前,VS2008必须已经安装。

4、 安装BizTalk Adapter Pack 2.0

(先安装BizTalk Adapter Pack 2.0,再WCF LOB Adapter SDK,最好完全安装)

二、 使用WCF_SQL adapter

这里使用一个例子来说明如何使用WCF_SQL adapter。

1、 例子场景

系统A有个雇员表Employees,结构如下:

字段

类型

说明

ID

int

自增长id

Name

nvarchar(50)

姓名

Age

int

年龄

Gender

int

性别

New

bit

是否新增

当有新雇员加入到此表,New字段先置为1,表示是新增的雇员。这张雇员表要传到系统B的雇员表EmployeesTarget,表结构跟上面的雇员表一样,只是少了New字段。

Biztalk要做的是使用WCF_SQL adapter读取系统A的雇员表Employees中的新增雇员,同时将New字段置为0,然后将新增的雇员写入到系统B的雇员表EmployeesTarget里。

2、 接收位置

2.1.   准备获得数据的存储过程

在系统A中建一个读取新雇员的存储过程:

ALTER PROCEDURE [dbo].[GetEmployees]

AS

BEGIN

--获取所有新增用雇员的记录

select Name,Age,Gender from dbo.Employees where New=1

update dbo.Employees set New=0 where New=1

END

2.2.   使用向导获得接收数据的schema

下面在VS2008中新建接收新增雇员的schema,在VS2008的biztalk项目上点击右键,选择“添加生成项”:

选择“Consume Adapter Service”:

在Select a binding下选择“sqlBinding”,使用WCF_SQL adapter。

点击右上方的“Configure”按钮:

配置要连接sql server的用户名和密码。

在URI Properties标签里如下设置:

Server – 设置要连接的sql server名或IP

InitialCatalog – 要连接的数据库名

InboundId – 接收位置的序号

Binding Properties标签中:

作为接收端口,访问数据库采用轮训机制,就是按一定的时间间隔定时读取数据库。

InboundOperationType--属性有几种类型可选:Polling,TypedPolling,Notification。

Polling是轮询方式,但是这种方式是不带架构的,TypedPolling也是轮询方式,这种方式可以带出架构。Notification是用于数据有变化时进行相关通知。

如果需要轮询数据,又要能刷出数据架构,需要采用TypedPolling方式。

PollingIntervalInSecond – 轮询间隔时间

PolledDataAvailableStatement – 执行轮询的条件,这里一般是个select语句,这条语句应该返回一个单个的结果集,只要这个结果集的第一行第一列必须有值(如果是空结果集会报错),应该是个大于等于0的整数值。如果这个值大于0则执行下面PollingStatement指定的sql命令真正的开始轮询的操作。如果这个值等于0,则轮询语句不执行。

这个例子中可以设置为:select 1 from dbo.Employees where new=1

PollingStatement – 轮询命令,可以是sql语句,也可以是存储过程。

这个例子中可以设置为:exec dbo.GetEmployees

(note:binding Properties 标签中:useambienttransaction 这个值一定要是:false,不然最后运行的时候会报以下错误日志:)

适配器“WCF-SQL”返回一条错误消息。详细信息为“System.ObjectDisposedException: 无法访问已释放的对象。
对象名:“TransactionScope”。
   在 System.Transactions.TransactionScope.Complete()
   在 System.ServiceModel.Dispatcher.TransactionRpcFacet.ThreadLeave()
   在 System.ServiceModel.Dispatcher.TransactionBehavior.ClearCallContext(MessageRpc& rpc)
   在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage7(MessageRpc& rpc)
   在 System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)”。

Configure Adapter完成后,回到adapter设置主界面:

点击Connect按钮,如果在Configure中连接信息设置没问题,连接状态将会显示:已连接。

要作为接收端口,biztalk相当于服务端,所有在Select contract type要选择Service(Inbound Operations)

在选择了Service(Inbound Operations)时,在下边的Select a Category中一定是空的(除了那个省略号和斜杠),别无选择,点击这个斜杠。

在右边会出现三个可选的操作Polling,TypedPolling,Notification,他们的含义前面已经说过了。选择TypedPolling,点击“Add”按钮。

OK,完成向导。

可以看到在项目中生成了两个文件,一个是根据前面设置的轮询命令生成的schema,一个是可以导入到biztalk的接收位置和端口的绑定文件,可惜的是,向导生成的绑定文件都是使用的WCF_Custom的绑定而不是希望的WCF_SQL的绑定。所以这个例子里不使用向导生成的绑定文件。

看一下生成的schema:

跟前面的存储过程比较一下,可以发现生成的schema就是存储过程返回的那三个字段,说明向导刷到了存储过程的schema。

这跟非WCF的sql adapter不同,非WCF的sql adapter返回数据时必须使用for xml auto,xmldata返回架构,adapter向导才能刷出架构。WCF_SQL则不必,一般的select返回的结果集就可以直接刷出架构。

2.3.   配置物理接收位置

物理接收位置的配置几乎跟向导中的设置一模一样。

2.3.1.   General

2.3.2.   Binding

(配置物理接受位置在BIZTALK管理配置接受端口,useambienttransaction 这个值一定要是:false,在“other”选项里,选择用户帐户,接受管道要选择为:XMLReceive)

3、 发送端口

发送端口就是要把接收端口接收进来的新增雇员数据写入到另一张雇员表(B系统)。

(以下操作都是在B系统,另一台机器的数据库 )

3.1.   准备用户定义的表类型

发送到系统B的新雇员数据是一张可能有多条数据的雇员表,需要把数据表作为参数传送给存储过程。所以需要定义一个雇员表结构的用户定义的表类型:

CREATE TYPE [dbo].[UD_Employess] AS TABLE(

[Name] [nvarchar](50) NULL,

[Age] [int] NULL,

[Gender] [int] NULL

)

在sql server management studio中可以看到这个定义的用户定义表类型。有了这个表类型,就可以向存储过程传送雇员表了:

3.2.   准备更新雇员数据的存储过程

使用前面定义的用户定义表类型作为输入参数,新建一个向系统B写入新雇员数据的存储过程:

ALTER PROCEDURE [dbo].[UpdateEmployees]

@EmployessTable dbo.UD_Employess READONLY

AS

BEGIN

insert into dbo.EmployeesTarget (Name,Age,Gender)

select Name,Age,Gender from @EmployessTable

END

3.3.   使用向导获得发送数据的schema

下面开始使用向导生成调用UpdateEmployees存储过程的schema。

同样是在VS2008的biztalk项目上点击右键,选择“添加生成项”,Consume Adapter Service,弹出添加适配器向导窗口中选择“sqlBinding”。

在设置好登陆用户名和密码,要连接的服务器和数据库,在Configure Adapter的Binding Properties标签中不需要跟接收端口时一样,这里不需要在绑定属性中做前面的设置。

直接回到adapter设置主界面:

连接数据库,前面设置正确的话,连接状态会显示为:已连接。

发送端口应该选择“Client(Outbound operations)”,这时在下面会出现可以选择指定数据库的发送端口可用的资源。为了能刷出架构,这里选择“Strong-Typed Procedure”,在右边显示出指定数据库所有的存储过程,这里选择[dbo].[UpdateEmployees],这是往系统B插入新雇员的存储过程。

OK,完成向导。

可以看到在项目中生成了三个文件,TableType.dbo.xsd是UpdateEmployees使用的用户定义表类型输入参数生成的schema,一个是UpdateEmployees存储过程生成的schema,一个是可以导入到biztalk的发送端口的绑定文件:

看一下TableType.dbo.xsd用户定义表类型的schema:

可以看出这个架构就是前面定义的UD_Employess表类型的结构。

3.4.   配置物理发送端口

新建一个WCF_SQL的发送端口,配置这个端口。

3.4.1.   General

在Configure中配置要连接的sql server服务器和数据库。

SOAP Action指定要访问的这个数据库的哪个存储过程,Action的具体值可以在向导生成的绑定文件中找到:

3.4.2.   Credentials

在Credentials标签中输入访问sql server的用户名和密码:

(配置物理发送端口在BIZTALK管理配置发送端口,useambienttransaction 这个值一定要是:false,在“other”选项里,选择用户帐户,发送管道要选择为:XMLTransmit)

4、 流程设计

流程很简单,从系统A通过WCF_SQL接收端口接收新雇员的消息,mapping成发送到系统B的消息,然后发送到系统B:

Mapping为:

/Files/qipilang/BizTalkWCFSQL.rar 项目程序

在做这个教程的时候,遇到几个问题:

1.用vs打开biztalk的时候,需要用管理员权限打开,否则编译的时候,会报一些拒绝访问。

2. 在运行biztalk出现以后,先去“Windows事件日志”中查找出错误,如果事件日志中没有错误,再去biztalk group,查看”挂起的服务实例“。查找原因。

3.最好把biztalk中业务流程,接受端口,发送端口的跟踪全部打开,这样可以在biztalk group“跟踪消息事件”查看各个端口,是那个端口出的错等信息。

4. 做的过程中,事件日志报这个一个错:

在基于内容的消息路由中提示“无法路由发布的消息,因为找不到订户”
错误信息:
错误详细信息: 无法路由发布的消息,因为找不到订户。如果订阅业务流程或发送端口尚未登记,或者订阅评估必需的某些消息属性尚未升级,就会出现此错误。请使用 Biztalk 管理控制台排除此故障。 解决办法:
可能的解决办法,在没有使用业务流程编排的项目中,在发送端口的筛选器设置,
属性:BTS.ReceivePortName
运算符:==
值:[接收端口名称]
分组依据:与

biztalk中使用WCF-SQL接受传送数据【转】的更多相关文章

  1. android 通过访问 php 接受 or 传送数据

    先说传送数据,可以在 利用 php 代替传送,直接把 访问的url加上 xxx.php?informatin=xxxxxx 就行了 接收的看代码吧,详细注释. 首先是 我自己定义的php 文件 < ...

  2. WCF 传输和接受大数据

    向wcf传入大数据暂时还没找到什么好方案,大概测了一下传输2M还是可以的,有待以后解决. 接受wcf传回的大数据,要进行web.config的配置,刚开是从网上搜自己写进行配置,折磨了好长时间. 用以 ...

  3. mysql提取.sql备份文件中的单个表以及表数据

    背景:随着业务模块的不断在增多,数据库mysql容量也是越来越大,做测试时,整个备份还原比较耗费时间,由于有时候仅仅需要单个表或者少数几个表,要想从整个备份文件中提取指定的表以及数据,需要以下方法. ...

  4. mssql sqlserver 使用sql脚本检测数据表中一列数据是否连续的方法分享

    原文地址:http://www.maomao365.com/?p=7335 摘要:    数据表中,有一列是自动流水号,由于各种操作异常原因(或者插入失败),此列数据会变的不连续,下文将讲述使用sql ...

  5. SQL查找数据库中所有没有主键的数据表脚本

    --SQL查找数据库中所有没有主键的数据表脚本 --运行脚本后在消息中可能会显示下面现象中的一种:--(1)数据库中所有数据表都有主键(则证明所有数据表都有主键)--(2)当前数据表[数据表名]没有主 ...

  6. SQL 中 NOT IN 查询不到数据

    一.问题 用以下sql语句查询数据,结果为空 SELECT a.ID , a.Sub_Project_Name , a.Sub_Project_Type FROM TB_KYSubProject a ...

  7. SQL Server中bcp命令的用法以及数据批量导入导出

    原文:SQL Server中bcp命令的用法以及数据批量导入导出 1.bcp命令参数解析 bcp命令有许多参数,下面给出bcp命令参数的简要解析 用法: bcp {dbtable | query} { ...

  8. 在jfinal的Controller中接受json数据

    JFinal中接收URL中的参数或者model中的参数是很方便的,但是对于web2.0的网站来说,经常会以json方式提交比较复杂的数据,比如一个查询,包含了各种过滤条件和排序分页,前端脚本可能提交的 ...

  9. BizTalk 开发系列(四十) BizTalk WCF-SQL Adapter读取SQL Service Broker消息

    SQL Service Broker 是在SQL Server 2005中新增的功能.Service Broker 为 SQL Server 提供队列和可靠的消息传递,可以可用来建立以异步消息为基础的 ...

随机推荐

  1. SG函数题目

    HDU Fibonacci again and again 思路: 把整个游戏看成三个子游戏,然后求游戏的和 关键理解g(x) = mex(g(y), y€f(x)) , f(x)表示由x点可达的点, ...

  2. 老笔记本_Win7_U盘_ReadyBoost

    老笔记本 Win7 U盘 ReadyBoost 值得尝试

  3. nodejs学习笔记<六>文件处理

    nodejs处理文件模块:fs  —>  var fs = require(‘fs’); 读取文件:readFileSync & readFile 读取文件路径为绝对: 读取结果需要to ...

  4. mysql 事务隔离级别

    read-uncommitted(未提交读)测试流程:1.A设置read-uncommitted, start transaction2.B执行start transaction,修改一条记录,3.A ...

  5. Android提高篇之自定义dialog实现processDialog“正在加载”效果、使用Animation实现图片旋转

     知识点: 1.使用imageview.textview自定义dialog 2.使用Animation实现图片旋转动画效果 3.通过自定义theme去掉dialog的title 没有使用progres ...

  6. synchronized与static synchronized 的区别

    synchronized是对类的当前实例加锁,防止其他线程同时访问该类的该实例的synchronized块,这里的概念是“类的当前实例”,而static synchronized是对类的所有实例加锁, ...

  7. Android_程序结构分析

    一.Android程序运行过程 二.Android项目结构  

  8. spring-mvc 与 openid4java

    以GoogleOpenID 为例,试验了OAuth单点登录的用法: <dependency> <groupId>org.openid4java</groupId> ...

  9. c#动态创建ODBC数据源

    使用C#有两种方法可以动态的创建ODBC数据源,这里我用比较常用的SQL2000作为例子. 方法1:直接操作注册表,需要引用Microsoft.Win32命名空间 /// <summary> ...

  10. form表单生成的简单理解

    1, drupal_get_form,只要是准备$form_state['build_info']['arg'], 然后进入drupal_build_form(), 2, form build 主要有 ...