Переопределение строки подключения конфигурации SSIS в .NET

Я пишу приложение, которое программно импортирует выбранные пользователем плоские файлы в базу данных (с другой логикой, поэтому мне действительно нужно использовать SSIS). У меня есть список пакетов SSIS в таблице, я загружаю пакет и выполняю его в коде. Однако мои пакеты SSIS используют параметры времени разработки для поиска своей конфигурации на другом сервере базы данных (в данном случае QA), а не параметры конфигурации времени выполнения.

Как я могу переопределить строку подключения, чтобы использовать ту, которую я бы предоставил в коде?

Вот пример источника, который я использую

Dim app As New Microsoft.SqlServer.Dts.Runtime.Application
Dim pkg As Microsoft.SqlServer.Dts.Runtime.Package = New Microsoft.SqlServer.Dts.Runtime.Package()

pkg = app.LoadFromSqlServer(packageName, serverName, Nothing, Nothing, Nothing)

pkg(0).ConfigurationType = DTSConfigurationType.ISqlServer


Dim result = pkg.Execute

person Tachi    schedule 22.10.2013    source источник


Ответы (2)


Взгляните на исходный код для DTLoggedExec.

В файле Program.cs есть некоторый код, который устанавливает значения свойств, вы, вероятно, можете использовать его в своей программе.

DtsProperty p;
Variable pkgObj;
pkgObj = (Variable)package.GetObjectFromPackagePath(valuePath, out p);                                        

if (p != null && pkgObj != null)
{
Console.WriteLine(" (Parameter Type: " + pkgObj.DataType + ")");
p.SetValue(pkgObj, Convert.ChangeType(s[1], pkgObj.DataType));
}

valuePath — это путь к объекту, а s1 — это значение, которое вы хотите поместить в это свойство. Для диспетчера соединений это обычно что-то вроде:

\Package.Connections[CONNMGRNAME].Properties[ConnectionString]
person N West    schedule 22.10.2013
comment
Я полагаю, что это будет работать, даже если заданы параметры времени разработки. Проблема по-прежнему может возникнуть, если строка соединения устанавливается выражением позже. В этом случае вы можете изменить значение выражения, используя аналогичный код. - person N West; 22.10.2013
comment
Большое спасибо N West. Я, наконец, успешно отменил параметры, следуя вашему предложению. - person Tachi; 25.10.2013

Ваш объект пакета должен предоставлять свойство Connections/коллекцию ConnectionManager. Вы можете повторить эту коллекцию, чтобы найти CM, который вы хотите изменить. После этого просто установите его ConnectionString на любое правильное значение.

person White_Raven    schedule 22.10.2013
comment
Да, и помните, что это значение (как и любое другое) можно изменить только из кода, прежде чем вы запустите Execute для объекта пакета. Однако то, что сказал @NWest, по-прежнему применимо: если у вас есть выражение в пакете, установленное для этого конкретного ConnestionManager.ConnectionString, его вычисленное значение будет иметь приоритет перед тем, которое вы установили из кода. - person White_Raven; 22.10.2013
comment
Спасибо White_Raven. Это проблема, с которой я столкнулся, когда значения параметров, которые я установил в коде, были переопределены значениями времени разработки. - person Tachi; 25.10.2013