1

我在 SSIS“连接管理器”中有一个源连接。它是自定义连接(不是 oledb 或任何其他标准连接类型)。是否可以在 Biml 脚本中重用它(即调用它)而无需再次编写连接字符串?

我在网上看到了两种方法,但都没有和我一起工作:我做了一个连接Advanturwork数据库的例子,下面是项目的截图和错误消息以及两种方法的代码。

这是项目文件。

项目文件

这是连接管理器 XML 文件 (MyConn.conmgr)。

MyConn.conmgr

现在是 Biml 代码(方式 1):

<Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <Packages>
        <Package Name="Package1" ConstraintMode="Linear" >
            <Connections>
                <Connection ConnectionName="MyConn" Id="FB58654F-7992-4DB2-9057-38595A89B6BF"></Connection>
            </Connections>
            <Tasks>
                <Dataflow Name="DF1">
                    <Transformations>
                        <OleDbSource Name="Get Data" ConnectionName="MyConn">
                            <ExternalTableInput Table="Person.Person"/>
                        </OleDbSource>
                    </Transformations>
                </Dataflow>
            </Tasks>
        </Package>
    </Packages>
</Biml>

我得到的错误在这里:

错误信息1

第二个Biml代码(方式2):

<#@ import namespace="System" #>
<#@ import namespace="System.Data" #>

<Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <# var Source = (AstDbConnectionNode)RootNode.Connections["MyConn"]; #>
    <Packages>
        <Package Name="Package1" ConstraintMode="Linear" >
            <Tasks>
                <Dataflow Name="DF1">
                    <Transformations>
                        <OleDbSource Name="Get Data" ConnectionName="Source">
                            <ExternalTableInput Table="Person.Person"/>
                        </OleDbSource>
                    </Transformations>
                </Dataflow>
            </Tasks>
        </Package>
    </Packages>
</Biml>

错误信息是一样的:

错误信息2

示例中的 PS MyConn 是一个 oledb,但在实际项目中,它是一个自定义连接,已在“连接管理器”中定义,我只需要在 biml 脚本中使用(调用它)即可。

谢谢,齐亚德

4

1 回答 1

0

好的,现在我看到足以理解这个问题了。

在您的 SSIS 项目中,您有一个项目级连接管理器“MyConn”。这是在 Biml 之外生成的。

在您的 Biml 文件中,您希望引用现有的物理连接管理器。不幸的是,这不是直接可能的。Biml 定义了项目中的所有工件以及其中的依赖项。Biml 引擎使用所有这些来创建输出 - 在这种情况下将是

  • 套餐
  • [项目级连接管理器]
  • [SSIS 项目文件]

[可选的]

您需要获取输出(连接管理器)并将其逆向工程到 Biml。有两种简单的方法:BimlOnline.com 或 BimlStudio。BimlOnline 仍处于测试阶段,如果它适合您,那就太好了。否则,您需要下载/注册BimlStudio并使用 15 天试用版并对现有 SSIS 项目(Integration Services Project 1.dtproj)进行反向工程。这应该会为自定义连接管理器提取 Biml。

如果没有,那么它会变得很难看,因为您必须通过连接管理器的语法来猜测/破坏您的方式,或者尝试发送电子邮件至 support@varigence.com,看看他们是否无法帮助您。

现在,一旦你有一个有效的连接字符串,那么你需要在你使用它的地方修复上面的 Biml。

第一个二进制文件

在您的第一个示例中,<OleDbSource Name="Get Data" ConnectionName="MyConn">只有当您还在 Connections 集合中定义了 Connection 时,您才会这样做。在下面的 Biml 中,我在我的 Connections 集合中定义了 MyConn。然后,在 Packages 集合下的 package 中Package1,我提供了对该连接管理器的显式引用,并指定了应为其分配的 GUID。您的包裹中可能需要也可能不需要,但我的一般经验是不需要它。

<Biml>
    <Connections>
        <Connection Name="MyConn" ConnectionString="ABC" />
    </Connections>
    <Packages>
        <Package Name="Package1" ConstraintMode="Linear" >
        <Connections>
            <Connection ConnectionName="MyConn" Id="FB58654F-7992-4DB2-9057-38595A89B6BF"></Connection>
        </Connections>
        </Package>
    </Packages>
</Biml>

正如下面杂乱无章的方式所调用的那样,您可以将 Connections 集合物理分离到一个单独的文件中并包含/多选它。

第二个二进制文件

在这里,您正在创建一个 C# 变量,Source这是我们连接的对象版本。这假设在较早的层中,我们已经显式创建了一个名为 MyConn 的连接。否则,您将获得空引用异常,因为您尝试访问不存在的列表(连接)的成员。

第二个问题是当你去使用它时<OleDbSource Name="Get Data" ConnectionName="Source">Biml 编译器会说它找不到对连接“Source”的引用。相反,您在这里寻找的是ConnectionName="<#= Source.Name #>"该指令使用我们的变量 Source 的 Name 属性并调用 Write 方法<#= #>

<Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <# var Source = (AstDbConnectionNode)RootNode.Connections["MyConn"]; #>
    <Packages>
        <Package Name="Package1" ConstraintMode="Linear" >
            <Tasks>
                <Dataflow Name="DF1">
                    <Transformations>
                        <OleDbSource Name="Get Data" ConnectionName="Source">
                            <ExternalTableInput Table="Person.Person"/>
                        </OleDbSource>
                    </Transformations>
                </Dataflow>
            </Tasks>
        </Package>
    </Packages>
</Biml>

较早但可能有用的 Biml 杂文

认为您要问的是代码重用。

在您的 SSIS 项目中,您有两个 Biml 文件:Connections.biml 和 Packages.biml

Connections.biml 看起来像(近似)

<Biml>
    <Connections>
        <Connection Name="MyConn" ConnectionString="ABC" />
    </Connections>
</Biml>

我们在上面的问题中定义了实际的 Packages biml。Packages.biml 文件可以在其中定义一个 Connections 集合,或者我们可以引用现有文件。使用 BimlExpress 有多种方法可以做到这一点。

多次点击选项

在 Visual Studio 中,多选(Control,左键单击)Connections.biml 和 Package.biml 文件,然后选择 Generate SSIS Packages。

在此处输入图像描述

Reeves 对分层及其工作原理有很好的解释,但简而言之,所有静态文件都将首先编译并可供参考。然后任何像 Packages.biml 这样的带有代码的 Biml 文件都有。

您可以根据需要进行多选——我的典型项目有一个 Connections.biml 文件,通常是一个 Packages.biml(构建工作包)和一个 Master.biml(处理包执行的编排)。

导入文件

将文件导入 Biml 有不同的机制,但最常见的两种是include指令和CallBimlScript函数。包含可以被认为是一个宏扩展 -<#@ include file="Connection.biml"#>将被替换为该文件的内容。

<#=CallBimlScript("Connection.biml")#>可以被认为是一个函数调用——因为它是。我可以在我传入的引用文件中定义属性(参数)来控制生成的 biml。

在任何一种情况下,实体在 biml 项目中都不存在/不可引用,例如 RootNode.Connections["MyConnection"]因为它们正在此层中编译。

BimlStudio

如果您决定购买 BimlStudio,第三种方法是将您的 Connections.biml 文件设置为实时 biml 脚本(或执行 Connections.biml 文件)以获取持久的内存对象以供参考。

于 2017-11-30T16:55:09.333 回答