2015-08-04 5 views
5

У меня есть пакет SSIS, который имеет набор Project.params.Передача параметров SSIS с C#

Как передать значения для этих параметров в пакет SSIS через C#?

Пытаюсь следующее:

const string pkgLocation = @"export.dtsx"; 
var app = new Application(); 
var pkg = app.LoadPackage(pkgLocation, null); 

var results = pkg.Execute(); 

Это возвращает ошибку, с коллекции Ошибки, содержащие «Переменная„$ Project :: connString“не был найден в коллекции переменных переменная не может существовать. в правильном объеме ".

Так что я попытался добавить

var param = pkg.Parameters.Add("connString", TypeCode.String); 
param.Value = "test"; 
var results = pkg.Execute(); 

Но это бросает DtsGenericException.

+0

Посмотрите на документацию для метода 'LoadPackage'. Это перегруженный метод, и должен быть тот, который принимает 5 параметров, что было бы одним из способов сделать это. О, это параметр проекта. Я не запускал пакет через .net, который использует модель развертывания проекта. Я подозреваю, что вам понадобится больше кода, так как вам нужно будет ссылаться на ispac проекта, чтобы он знал об объектах уровня проекта. – billinkc

+0

Ошибка упоминает набор переменных и параметры ... пытались ли вы добавить его к переменным? 'pkg.Variables.Add (" connString ", false," Project "," test ");' (предполагая, что пространство имен ваших переменных является «Project») – nemesv

+0

Попробуйте использовать метод перегрузки Execute объекта пакета, который принимает в себя набор переменных , https://msdn.microsoft.com/en-us/library/microsoft.sqlserver.dts.runtime.dtscontainer.execute.aspx – Alessi

ответ

-1

Я считаю, что вам нужно будет использовать класс ParameterValue.

служба
var parameters = new ParameterValue[somelength]; 
parameters[index] = new ParameterValue() 
{ 
    Name = "parameter name", 
    Value = "parameter value" 
} 

В докладе будет иметь метод:

SetExecutionParmeters(parameters, language). 

Я предполагаю, что вы загружаете отчет, «export.dtsx», в SSIS и выполнение через службу отчетов.

+0

Нет, это SSIS не SSRS. –

3

Я думаю, что получил. Трюк заключается в десериализации вашего файла ispac (VS строит это, но вы можете сделать это через msbuild) в объект Project. Объект Project позволяет нам устанавливать параметры уровня проекта (а также диспетчеры соединений уровня доступа на уровне проекта).

Оттуда нам нужно будет получить ссылку на конкретный пакет, который мы хотим, но это будет PackageItem. PackageItems не может работать, но они имеют свойство пакета мы будем использовать для создания экземпляра класса, который Packageделает имеют Execute методы

public static void final() 
    { 
     string isPacPath = @"C:\sandbox\so_31812951\so_31812951\bin\Development\so_31812951.ispac"; 
     string packageName = "Package.dtsx"; 
     Application app = new Application(); 
     Package pkg = null; 

     // https://msdn.microsoft.com/en-us/library/ff930196(v=sql.110).aspx 
     Project proj = null; 
     PackageItem pi = null; 
     DTSExecResult results; 

     /////////////////////////////////////////////////////////////////// 
     // Run an SSIS package that has a Project parameter 
     /////////////////////////////////////////////////////////////////// 
     proj = Project.OpenProject(isPacPath); 

     // Yes, I can see the packages in there 
     foreach (var item in proj.PackageItems) 
     { 
      Console.WriteLine(string.Format("Project {0} contains package {1}", proj.Name, item.StreamName)); 
     } 

     //Also able to see the project level parameters 
     foreach (Parameter item in proj.Parameters) 
     { 
      Console.WriteLine(string.Format("Project {0} contains parameter {1} type of {2} current value {3}", proj.Name, item.Name, item.DataType, item.Value)); 
     } 

     // assign a value to my project level parameter 
     proj.Parameters["ProjectParameter"].Value = 10; 

     // Get the package from the project collection 
     pi = proj.PackageItems[packageName]; 

     // Convert the package into a package object 
     pkg = pi.Package; 

     // This is how we specify a package parameter value 
     pkg.Parameters["PackageParam"].Value = 777; 

     results = pkg.Execute(); 

     Console.WriteLine(results); 
    } 

Это предполагает, у вас есть проект SSIS называется so_31812951, который составлен на МНПКС, расположенный в C: \ sandbox \ so_31812951 \ so_31812951 \ bin \ Development \ so_31812951.ispac Этот проект имеет один пакет, называемый Package.dtsx. Там будет параметр уровня проекта, Int32, с именем ProjectParameter, а также параметр уровня пакета, Int32, с именем PackageParam

Смежные вопросы