我在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>
错误消息是相同的:
附:示例中的MyConn是一个oledb,但在实际项目中,它是一个自定义连接,已经在“连接管理器”中定义,我只需要在biml脚本中使用(调用它) .
谢谢,齐亚德
1 回答
好的,现在我看到了足够的理解这个问题 .
在您的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 . 您的包裹可能需要也可能不需要,但我的一般经验是不需要它 .如下面的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 ramblings
我想你要问的是代码重用 .
在SSIS项目中,您有两个Biml文件:Connections.biml和Packages.biml
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
如果您决定购买BimlStudio,第三种方法是将Connections.biml文件设置为实时biml脚本(或执行Connections.biml文件)以获得持久的内存中对象以供参考 .