2015-08-04 12 views
5

Ich habe ein SSIS-Paket, das einige Project.params gesetzt hat.SSIS-Parameter von C# übergeben

Wie übergebe ich Werte für diese Parameter über C# an das SSIS-Paket?

Ich versuche folgendes:

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

var results = pkg.Execute(); 

Dies gibt einen Fehler, mit Fehlern Sammlung „Die Variable‚$ Projekt :: connString‘wurde nicht in der Variablen Sammlung enthalten gefunden Die Variable möglicherweise nicht vorhanden. im richtigen Umfang. " So

Ich versuchte

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

Zugabe Aber das wirft ein DtsGenericException.

+0

Schauen Sie sich die Dokumentation für die LoadPackage-Methode an. Das ist eine überladene Methode und es sollte eine sein, die 5 Parameter akzeptiert, das wäre eine Möglichkeit, dies zu tun. Oh, das ist ein Projektparameter. Ich habe kein Paket über .net gestartet, das das Projektbereitstellungsmodell verwendet. Ich vermute, dass Sie mehr Code benötigen, da Sie auf das ispac des Projekts verweisen müssen, damit es die Entitäten auf Projektebene kennt. – billinkc

+0

Der Fehler erwähnt die Variablensammlung und die Parameter ... haben Sie versucht, es zu den Variablen hinzuzufügen? 'pkg.Variables.Add (" connString ", false," Projekt "," test ");' (unter der Annahme, dass der Namespace Ihrer Variablen "Projekt" ist) – nemesv

+0

Versuchen Sie, die Overload-Methode Execute des Package-Objekts zu verwenden, die eine Auflistung von Variablen aufnimmt . https://msdn.microsoft.com/en-us/library/microsoft.sqlserver.dts.runtime.dtscontainer.execute.aspx – Alessi

Antwort

-1

Ich glaube, dass Sie die ParameterValue-Klasse verwenden müssen.

var parameters = new ParameterValue[somelength]; 
parameters[index] = new ParameterValue() 
{ 
    Name = "parameter name", 
    Value = "parameter value" 
} 

Der Bericht Service wird eine Methode:

SetExecutionParmeters(parameters, language). 

Ich gehe davon aus Sie den Bericht laden, "export.dtsx", in SSIS und über den Berichtsdienst ausgeführt wird.

+0

Nein, es ist SSIS nicht SSRS. –

3

Ich denke, ich habe es. Der Trick besteht darin, Ihre ispac-Datei zu deserialisieren (VS erstellt dies, aber Sie können über msbuild tun) in ein Project Objekt. Das Project-Objekt ermöglicht es, Parameter auf Projektebene festzulegen (und auf Verbindungsmanager auf Projektebene zuzugreifen).

Von dort müssen wir einen Verweis auf das spezifische Paket erhalten, das wir wollen, aber es wird ein PackageItem sein. PackageItems kann nicht ausgeführt werden, aber sie haben ein Paket Eigenschaft haben, verwenden wir die Package Klasse, die tut haben eine Execute Methode

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); 
    } 

Dies setzt voraus, Sie haben ein SSIS Projekt so_31812951 was einem ISpac zusammengestellt genannt zu instanziiert gelegen in C: \ sandbox \ so_31812951 \ so_31812951 \ bin \ Entwicklung \ so_31812951.ispac Dieses Projekt hat ein einzelnes Paket namens Package.dtsx. Es gibt einen Project-Level-Parameter Int32 mit dem Namen ProjectParameter sowie einen Package-Level-Parameter Int32 mit dem Namen PackageParam