Используйте уже созданное соединение в "Менеджерах соединений" в Biml-скрипте
У меня уже есть исходное соединение в SSIS "Диспетчеры соединений". Это пользовательское соединение (не oledb или любые другие стандартные типы соединений). Можно ли повторно использовать его (т.е. вызывать) в сценарии Biml без повторной записи строки подключения?
Я видел два пути в Интернете, но ни один из них не работал со мной: я сделал пример подключения к базе данных Advanturwork, ниже приведены скриншоты проекта и сообщение об ошибке, а также код этих двух способов.
Вот файлы файлов.
Это 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>
Я получаю ошибку здесь:
Второй код Бимла (способ 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>
Сообщение об ошибке то же самое:
PS MyConn в примере - это oledb, но в реальном проекте это пользовательское соединение, которое уже определено в "Диспетчерах соединений", и мне нужно просто использовать (вызвать его) в biml-скрипте.
Спасибо зиад
1 ответ
Хорошо, теперь я вижу достаточно, чтобы понять вопрос.
В вашем проекте SSIS у вас есть менеджер соединений на уровне проекта "MyConn". Это было создано за пределами Бимла.
В ваших файлах 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">
Это будет работать, только если вы также определили свое Соединение в коллекции Соединений. В следующем Biml я определяю MyConn в моей коллекции Connections. Затем, под коллекцией пакетов, в упаковке 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 в отдельный файл и включить / multi-select.
Второй бимл
Здесь вы создаете переменную C#, Source
это объектная версия нашего соединения. Это предполагает, что на более раннем уровне мы явно создали соединение с именем MyConn. В противном случае вы получите исключение нулевой ссылки, потому что вы пытаетесь получить доступ к члену списка (Соединения), который не существует.
Вторая проблема будет, когда вы идете использовать его <OleDbSource Name="Get Data" ConnectionName="Source">
Компилятор Biml скажет, что не может найти ссылку на соединение "Source". Вместо этого, то, что вы ищете здесь ConnectionName="<#= Source.Name #>"
Эта директива использует свойство Name нашей переменной Source и вызывает метод 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.
Опция Multi-click
В Visual Studio несколько раз выберите (Control, щелкните левой кнопкой мыши) файлы Connections.biml и Package.biml и выберите "Создать пакеты служб SSIS".
У Ривза есть отличное объяснение уровня и того, как все это работает, но вкратце, все статические файлы будут скомпилированы первыми и будут доступны для справки. Затем любые файлы Biml с кодом в них, как Packages.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), чтобы иметь постоянные объекты в памяти для справки.