首页 文章

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

提问于
浏览
1

我在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

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

谢谢,齐亚德

1 回答

  • 0

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

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

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

    • 包裹

    • [项目级连接管理器]

    • [SSIS项目文件]

    [可选的]

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

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

    现在,一旦你有一个工作连接字符串,那么你需要修复上面使用它的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 . 否则,你'll get a null reference exception because you are trying to access a member of a list (Connections) that doesn' t存在 .

    第二个问题是当你使用它时 <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 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文件)以获得持久的内存中对象以供参考 .

相关问题