我在SSIS“连接管理器”中已有源连接。它是自定义连接(不是oledb或任何其他标准连接类型)。是否可以在Biml脚本中重用它(即调用它)而无需再次编写连接字符串?
我在互联网上看到了两种方式,但都没有与我合作:我做了一个连接到Advanturwork数据库的例子,下面是项目的截图和错误信息以及两种方式的代码。
这是项目文件。
这是连接Managers XML文件(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>
我得到的错误是:
第二个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>
错误信息相同:
P.S。示例中的MyConn是一个oledb,但在实际项目中,它是一个自定义连接,已经在“连接管理器”中定义,我只需要在biml脚本中使用(调用它)。
谢谢, 齐亚德
答案 0 :(得分:0)
好的,现在我看到了足够的理解这个问题。
在您的SSIS项目中,您有一个项目级别的连接管理器&#34; MyConn&#34;。这是在Biml之外产生的。
在Biml文件中,您希望引用现有的物理连接管理器。不幸的是,这是不可能的。 Biml定义项目中的所有工件以及其中的依赖项。 Biml引擎使用所有这些来创建输出 - 在这种情况下将是
[可选]
您需要将输出(连接管理器)和逆向工程转换为Biml。有两种简单的方法:BimlOnline.com或BimlStudio。 BimlOnline仍然处于测试阶段,如果它适合你,太棒了。否则,你 需要下载/注册BimlStudio并使用15天试用版并对现有SSIS项目进行逆向工程(Integration Services Project 1.dtproj)。 应该获取为自定义连接管理器提取的Biml。
如果它没有,那么它会变得丑陋,因为您必须通过您的connection manager的语法猜测/破坏您的方式,或者尝试通过电子邮件发送support@varigence.com,看看它们是否可以&#39;帮助你。
现在,一旦你有一个有效的连接字符串,那么你需要在你使用它的地方修复上面的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集合物理地分隔为单独的文件,并包含/多选它。
在这里,您要创建一个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>
我认为您所询问的是代码重用。
在您的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。
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,第三种方法是将Connections.biml文件设置为实时biml脚本(或执行Connections.biml文件)以获取持久的内存中对象以供参考。