将“连接管理器”中已创建的连接用于Biml脚本

时间:2017-11-27 10:31:43

标签: ssis connection biml ssis-connection-manager

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

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

这是项目文件。

The project files

这是连接Managers 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>

我得到的错误是:

Error message1

第二个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>

错误信息相同:

Error message2

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

谢谢, 齐亚德

1 个答案:

答案 0 :(得分:0)

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

在您的SSIS项目中,您有一个项目级别的连接管理器&#34; MyConn&#34;。这是在Biml之外产生的。

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

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

[可选]

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

如果它没有,那么它会变得丑陋,因为您必须通过您的connection manager的语法猜测/破坏您的方式,或者尝试通过电子邮件发送support@varigence.com,看看它们是否可以&#39;帮助你。

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

第一个biml

在第一个示例中,您有<OleDbSource Name="Get Data" ConnectionName="MyConn">只有在Connections集合中定义了Connection时才会有效。在下面的Biml中,我在Connections集合中定义了MyConn。然后,在Packages集合中,在包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>

如下面的ramblings所述,您可以将Connections集合物理地分隔为单独的文件,并包含/多选它。

第二次biml

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

第二个问题是当你使用它时<OleDbSource Name="Get Data" ConnectionName="Source"> Biml编译器会说它无法找到对连接的引用&#34; Source&#34;。相反,你在这里寻找的是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 ramblings

认为您所询问的是代码重用。

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

Connections.biml看起来像(近似)

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

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

多击选项

在Visual Studio中,多选(Control,Left-Click)Connections.biml和Package.biml文件,然后选择Generate SSIS Packages。

enter image description here

Reeves对tiering and how all that works有一个很好的解释,但简短的是所有静态文件将首先编译并可供参考。然后任何带有代码的Biml文件就像Packages.biml一样。

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

导入文件

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

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

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

BimlStudio

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