2013-08-29 188 views
2

這是我的問題。我有一個SSIS包,它在輸入SegmentID上帶有1個參數。但我不能從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或執行的segmentID的特定實例? – billinkc

+0

不知道(這是一段時間我不玩SSIS),我想你給參數的項目,而不是包。所以,'project.Parameters' ...應該是'package.Parameters',不是? – kerrubin

+0

嗯,實際上這個軟件包是由另一個人編寫的,我只是想推出它。我嘗試將此參數傳遞給A LOT,但失敗。在調試模式下,我看到,這個參數實際上是打到Project,而不是打包(出於某種原因)。程序包本身以一個如下所示的任務開始:select * from where 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天以來的苦痛。