2013-08-29 3 views
2

Вот моя проблема. У меня есть пакет SSIS, который принимает 1 параметр на входе, называемом SegmentID. Но я не могу передать его из кода C#. Я нахожусь за 2 дня до сих пор, и вот решение, которое я придумал, которое должно работать, но не делает - пакет SSIS выходит из строя на этапе получения параметра. Какого черта я делаю неправильно?Передача пользовательских параметров в пакет SSIS

 using (SqlConnection con = GetConnection()) 
     { 
      var integrationServices = new IntegrationServices(con); 

      if (integrationServices.Catalogs.Contains("SSISDB")) 
      { 
       var catalog = integrationServices.Catalogs["SSISDB"]; 

       if (catalog.Folders.Contains("PSO")) 
       { 
        var folder = catalog.Folders["PSO"]; 

        if (folder.Projects.Contains("PSO_SSIS")) 
        { 
         var project = folder.Projects["PSO_SSIS"]; 

         project.Parameters["SegmentID"].Set(ParameterInfo.ParameterValueType.Literal, segmentID); 

         if (project.Packages.Contains("Main.dtsx")) 
         { 
          var package = project.Packages["Main.dtsx"]; 

          long executionIdentifier = package.Execute(false, null); 
          return catalog.Executions[executionIdentifier]; 
         } 
        } 
       } 
      } 
     } 
+0

Существует несколько различных способов работы с параметрами в модели проекта 2012 года. Вы пытаетесь настроить параметр Project как segmentId или конкретный экземпляр идентификатора сегмента выполнения? – billinkc

+0

Не уверен (это было какое-то время, когда я не играл с SSIS), я думаю, что вы даете параметр проекту, а не пакету. Итак, 'project.Parameters' ... должен быть' package.Parameters', нет? – kerrubin

+0

Ну, на самом деле пакет написан другим человеком, я просто должен его запустить. Я попытался передать этот параметр, чтобы упаковать A LOT, но не удалось. В режиме отладки я увидел, что этот параметр на самом деле соответствует проекту, а не пакету (по какой-то причине). Сам пакет начинается с задачи, которая выглядит следующим образом: select * from где SegmentID =? – KorsaR

ответ

7

Спасибо, ребята, но я понял это. Вы должны сделать что-то вроде этого:

var setValueParameters = new Collection<PackageInfo.ExecutionValueParameterSet>(); 
          setValueParameters.Add(new PackageInfo.ExecutionValueParameterSet 
          { 
           ObjectType = 20, 
           ParameterName = "SegmentID", 
           ParameterValue = 1 
          }); 

, а затем вызвать:

long executionIdentifier = package.Execute(false, null, setValueParameters); 

Почему это смущает меня так сильно, что я думал, что эта вещь только для системных параметров, как уровень ведения журнала или что-то , и NOWHERE было упомянуто, что код для пользовательских параметров равен 20, и эту конструкцию можно использовать для их назначения. Надеюсь, это поможет кому-то избежать, но у меня было 2 дня.

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