我有50个Biztalk包,我需要在包执行时登录一个单独的表。
我非常清楚Biztalk数据库会记录日志,因此不能将其作为解决方案提供。
我的表格定义:
CREATE TABLE [dbo].[BiztalkLog]
(
[ID] [int] IDENTITY(1,1) NOT NULL,
[BiztalkPackageID] [int] NULL,
[RunDate] [datetime] NULL,
CONSTRAINT [PK_BiztalkLog]
PRIMARY KEY CLUSTERED ([ID] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
我的存储过程:
CREATE PROCEDURE [dbo].[InsertBiztalkLog]
@BiztalkPackageID AS INT
AS
INSERT INTO dbo.BiztalkLog(BiztalkPackageID)
SELECT @BiztalkPackageID
GO
问题:
如何在业务流程中对BiztalkPackageID
值进行硬编码?因此,当存储过程执行一次时,它将知道要传递哪个值。
如何在业务流程中只执行一次存储过程?
答案 0 :(得分:1)
创建存储过程调用XML消息的实例;因为这是一个非常小而简单的消息,所以我在C#帮助程序类中将其设置为模板:
public static string biztalkLogTemplate = @"<ns0:BiztalkLog xmlns:ns0=""http://schemas.microsoft.com/Sql/2008/05/Procedures/dbo"">
<ns0:BizTalkPackageID>{0}</ns0:BizTalkPackageID>
</ns0:BiztalkLog>";
public static XmlDocument GetBiztalkLog(int packageId)
{
XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(string.Format(biztalkLogTemplate, packageId));
}
然后,在业务流程中添加一条消息(msgLogProc
),设置为使用存储过程的模式,并在构造消息表达式中添加:
msgLogProc = GetBiztalkLog(1); // whatever ID this orchestration is supposed to use.
然后,您可以在业务流程中设置一个端口,并将其(直接或静态)绑定到SQL过程的发送端口。使用Send
形状将msgLogProc
发送到该端口。如果您在循环形状之前执行此操作一次,则只会在每次编排执行时调用该过程。如果你需要它只是一些不同的标准(只有第一次执行一天或一批?),你需要一个不同的模式。您可能希望在SQL端处理此问题,但是,如果业务流程已经为该特定批次记录了某些内容(可能使用反加入,即INSERT ... WHERE NOT EXISTS (...)
,则会持续存在。
在业务流程中还有其他几种构建消息的方法,但我发现这对于像这样的小方案来说是最直接的。
答案 1 :(得分:0)
嗯,这些问题没有多大意义。您可能需要提供更多详细信息。
嗯,你这么做。你是如何制作请求信息的?
只召唤一次。你为什么会遇到不止一次被召唤的情况。
抱歉,我必须提醒您查询跟踪数据库更容易。另外,您是否考虑过在内部记录每个存储过程?我会考虑更正确的解决方案。