通过循环运行DB Lookup functoid的替代方法?

时间:2009-09-09 18:21:42

标签: sql-server biztalk

我真的不知道怎么说这个,所以这是我最好的镜头 - 我有一个表,用'TypeId'存储值和实际值。 'TypeId'映射到查找表中的一行,该行包含实际的纯文本描述。通过BizTalk Server 2009将数据插入我的数据库时,我需要对传入文件提供的每个值执行查找以获取其正确的TypeId,然后填充原始表。

我认为这样做的唯一方法是使用DB Lookup functoid,但由于每个输入文件可能会对此函数进行数百次调用,因此我不期待从中获取性能。有没有人知道在运行时执行该查找的另一种方法,或者可能只是从SQL查找一次,然后让BizTalk引用该表的一些内存表示?

编辑:我确实有一个想法,但是希望SO社区中的某个人告诉我它是否是一个坏的,如果是的话,为什么。这是:

我可以获取传入的文档并直接转换为XML,然后将生成的XMLDocument提供给外部.NET程序集。然后,该程序集可以将查找表作为Dictionary(或其他类型的IEnumerable)拉入,并通过添加正确的TypeId值来代替原始文档中的原始类型描述符来修改原始文档。从理论上讲,这可以让我通过替换(理论上)调用外部程序集的低得多的开销来避免大量数据库查找的开销。

有人能想到使用这种方法的原因吗?

4 个答案:

答案 0 :(得分:0)

我不熟悉BizTalk;但是如果你想从查找表中获取纯文本描述,你可以使用这样的SQL查询:

说你的表是: 值(TypeId,Value) TypeLookup(TypeId,TypeName)

然后你可以这样做:

SELECT Values.Value, TypeLookup.TypeId, TypeLookup.TypeName
FROM Values
LEFT JOIN TypeLookup ON TypeLookup.TypeId = Values.TypeId

这会为您返回每个值记录的结果。如果Values.TypeId不为null,您还将获得该值的TypeId和TypeName。

HTH

答案 1 :(得分:0)

您可以编写一个自定义静态类,其中包含一个以id作为参数的方法。然后可以从脚本functoid调用该方法。

这个类看起来像这样(警告:这只是一个简短的例子):

public class Values
{
 public static Dictionary<Int, String> LookupDictionary;

 public static string GetDictionaryValue(Int idIn)
 {
  if (LookupDictionary is null) -> go out to the database and populate;

  return LookupDictionary[idIn].Value;
 }

}

以下是一些注意事项。

  1. 如果你想从脚本functoid调用你的方法,那么这个类需要是非静态类。
  2. 此解决方案可能无法在多个biztalk服务器上运行良好,因为静态变量将按服务器基础保存在服务器上。
  3. 另一个替代方案是Blogical的这个增强型数据库functoid。我个人没有试过这个功能,但它可能正是你想要的。

    BizTalk Database lookup functoid with caching feature

答案 2 :(得分:0)

您建议的方法,在哪里进行转换,然后使用.NET程序集将ID替换为描述,应该适用于相对较小的消息,但是您会遇到较大消息的问题。

另一种选择是创建包含原始类型和新类型的多部分消息。新类型是您在转换之前使用名称 - 值对加载的类型。所以你现在有两条消息--Y(你的消息)和X(包含名字 - 值对的消息)。

获取现有地图的副本以防万一,然后修改变换形状,使其接受两种类型(类型Y和类型X) - 顺序并不重要。

在地图中 - 在需要执行查找的位置,添加脚本functoid并将其设置为 Inline XSLT

在内联XSLT中添加您的节点名称,然后添加 xsl:value-of select ... 元素。将xpath表达式放入查找ID的select语句中并选择该值。一个简单的表达式可能类似于 / Root / Lookups [@ id =“12345”] / - 但当然你的表达方式会有所不同。您可以通过单击包含名称 - 值对的节点来了解如何处理消息部分,并在属性字段中选择 Instance XPath

如果您不熟悉XPath或命名空间等,这将需要一些练习 - 但是当它工作时,它会很快并且可以无缝地工作,并且您将需要更少的代码来维护。

答案 3 :(得分:0)

我过去所做的是与两个功能合作。

第一个功能将有一些类似于Mike建议的代码。但是,我只是返回一个xml文件(具有密钥对值,如:

),而不是将其加载到静态属性。
<Types>
  <Type id="a" description="b" />
  <Type id="c" description="c" />
</Types>

第二个函数会将此XML字符串作为输入,并将您需要映射的值作为另一个输入。然后在代码中你可以找到所需的ID:

  • 使用XPath
  • 使用正则表达式(我使用常规表达式,因此我不必将xml字符串加载到任何类型的DOM中)。

我的地图然后会有第一个功能的结果根据需要提供第二个功能的副本(在我的情况下,我有10个左右的查找要执行)。

每次映射练习你仍然需要阅读一次数据库,但那就是它。

我希望这会有所帮助。