biztalk中使用WCF-SQL接受传送数据【转】

接触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

--将所有新增雇员的New字段置为0

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
运算符:==
值:[接收端口名称]
分组依据:与

时间: 2024-10-09 05:41:38

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

Sql Server删除数据表中重复记录 三种方法

本文介绍了Sql Server数据库中删除数据表中重复记录的方法. [项目]数据库中users表,包含u_name,u_pwd两个字段,其中u_name存在重复项,现在要实现把重复的项删除![分析]1.生成一张临时表new_users,表结构与users表一样:2.对users表按id做一个循环,每从users表中读出一个条记录,判断new_users中是否存在有相同的u_name,如果没有,则把它插入新表:如果已经有了相同的项,则忽略此条记录:3.把users表改为其它的名称,把new_use

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

先说传送数据,可以在 利用 php 代替传送,直接把 访问的url加上 xxx.php?informatin=xxxxxx 就行了 接收的看代码吧,详细注释. 首先是 我自己定义的php 文件 1 <?php 2 header("Content-Type: text/html; charset=utf8"); 3 4 $DataBase=$_REQUEST["DB"];//照应我java文件里面设置的DB 5 //$DataBase = "test&

sql server 获取每一个类别中值最大的一条数据

sql server 获取每一个类别中值最大的一条数据 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 /* 数据如下: name val memo a    2   a2(a的第二个值) a    1   a1--a的第一个值 a    3   a3:a的第三个值 b    1   b1--b的第一个

Sql从一张表中更改另一张表数据

语法: update table1 set table1.列=table2.列 from table2 where table2.列=table1.列update NFYSP.dbo.PATIENT     setPATIENT_ADDUSERID=OLD.PATIENT_ADDUSERID,PATIENT_UPDATEUSERID=OLD.PATIENT_UPDATEUSERID,PATIENT_UPDATEUSERNAME=OLD.PATIENT_UPDATEUSERNAME,PATIENT

C#将SQL数据库中数据导入Excel中,并将Excel中反导入SQL数据库中

实际的开发中,我们会经常遇到数据的转化的需要,将Excel中的数据转入到SQL中,或将SQL在数据库表中的数据导入到Excel中.代码如下: Code using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windo

WCF 传输和接受大数据

向wcf传入大数据暂时还没找到什么好方案,大概测了一下传输2M还是可以的,有待以后解决. 接受wcf传回的大数据,要进行web.config的配置,刚开是从网上搜自己写进行配置,折磨了好长时间. 用以下方式进行wcf配置: 1.在配置文件上右键,点击编辑wcf配置,如图: 选择你wcf的dll文件. 最后情形如图: 2.在工具里面也可以进行wcf配置,效果和上面的是一样的,如图:

SQL 中 NOT IN 查询不到数据

一.问题 用以下sql语句查询数据,结果为空 SELECT a.ID , a.Sub_Project_Name , a.Sub_Project_Type FROM TB_KYSubProject a WHERE a.ID NOT IN ( SELECT DISTINCT c.SubprojectID FROM TB_KYGrogramme c WHERE ISNULL(c.Belong_Programme, '') <> '' AND c.Belong_Programme IN ( SELEC

在SQLServer中使用SQL语句插入数据出现乱码或问号的解决方法

错误产生的原因: 出现使用SQL语句插入数据出现乱码或问号是由于数据库属性的排序规则设置不正确. 解决方法: 方法一:手动修改(设置数据库的排序规则) 注意事项:要确定修改的数据库没有被使用,否则会失败! 具体步骤:选中要修改的数据库-->右键-->属性-->弹出数据库属性对话框-->选项-->把排序规则设置成: Chinese_PRC_90_CI_AS-->确定. 方法二:使用代码修改 注意事项:要确定修改的数据库没有被使用,否则会失败!(将数据库连接断开执行这个脚本

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

SQL Service Broker 是在SQL Server 2005中新增的功能.Service Broker 为 SQL Server 提供队列和可靠的消息传递,可以可用来建立以异步消息为基础的应用.当然从题目大家可能也看出来了.我们本文主要不是为了讲SQL Service Broker(SSB),而是讲一下如何使用BizTalk WCF-SQL Adapter来访问SSB的数据. SQL Service Broker(SSB) 为要便于大家更好的接下来的示例,我们还是概况的讲一下SSB的