J'ai un package SSIS que j'aimerais éventuellement transmettre également des paramètres, ces paramètres proviendront d'une application .NET (VB ou C #), donc j'étais curieux de savoir comment faire cela, ou mieux encore un site Web avec des conseils utiles sur la façon de le faire.
Donc, fondamentalement, je veux exécuter un package SSIS à partir de .NET en passant les paramètres de package SSIS qu'il peut utiliser.
Par exemple, le package SSIS utilisera l'importation de fichiers plats dans une base de données SQL, mais le chemin et le nom du fichier peuvent être le paramètre transmis à partir de l'application .Net.
Réponses:
Voici comment définir des variables dans le package à partir du code -
using Microsoft.SqlServer.Dts.Runtime; private void Execute_Package() { string pkgLocation = @"c:\test.dtsx"; Package pkg; Application app; DTSExecResult pkgResults; Variables vars; app = new Application(); pkg = app.LoadPackage(pkgLocation, null); vars = pkg.Variables; vars["A_Variable"].Value = "Some value"; pkgResults = pkg.Execute(null, vars, null, null, null); if (pkgResults == DTSExecResult.Success) Console.WriteLine("Package ran successfully"); else Console.WriteLine("Package failed"); }
la source
Microsoft.SqlServer.ManagedDTS.dll
fichier du "GAC", dans leC:\Windows\assembly
dossier, pour compiler ce code.Voici comment faire avec le catalogue SSDB qui a été introduit avec SQL Server 2012 ...
using System.Collections.Generic; using System.Collections.ObjectModel; using System.Data.SqlClient; using Microsoft.SqlServer.Management.IntegrationServices; public List<string> ExecutePackage(string folder, string project, string package) { // Connection to the database server where the packages are located SqlConnection ssisConnection = new SqlConnection(@"Data Source=.\SQL2012;Initial Catalog=master;Integrated Security=SSPI;"); // SSIS server object with connection IntegrationServices ssisServer = new IntegrationServices(ssisConnection); // The reference to the package which you want to execute PackageInfo ssisPackage = ssisServer.Catalogs["SSISDB"].Folders[folder].Projects[project].Packages[package]; // Add a parameter collection for 'system' parameters (ObjectType = 50), package parameters (ObjectType = 30) and project parameters (ObjectType = 20) Collection<PackageInfo.ExecutionValueParameterSet> executionParameter = new Collection<PackageInfo.ExecutionValueParameterSet>(); // Add execution parameter (value) to override the default asynchronized execution. If you leave this out the package is executed asynchronized executionParameter.Add(new PackageInfo.ExecutionValueParameterSet { ObjectType = 50, ParameterName = "SYNCHRONIZED", ParameterValue = 1 }); // Add execution parameter (value) to override the default logging level (0=None, 1=Basic, 2=Performance, 3=Verbose) executionParameter.Add(new PackageInfo.ExecutionValueParameterSet { ObjectType = 50, ParameterName = "LOGGING_LEVEL", ParameterValue = 3 }); // Add a project parameter (value) to fill a project parameter executionParameter.Add(new PackageInfo.ExecutionValueParameterSet { ObjectType = 20, ParameterName = "MyProjectParameter", ParameterValue = "some value" }); // Add a project package (value) to fill a package parameter executionParameter.Add(new PackageInfo.ExecutionValueParameterSet { ObjectType = 30, ParameterName = "MyPackageParameter", ParameterValue = "some value" }); // Get the identifier of the execution to get the log long executionIdentifier = ssisPackage.Execute(false, null, executionParameter); // Loop through the log and do something with it like adding to a list var messages = new List<string>(); foreach (OperationMessage message in ssisServer.Catalogs["SSISDB"].Executions[executionIdentifier].Messages) { messages.Add(message.MessageType + ": " + message.Message); } return messages; }
Le code est une légère adaptation de http://social.technet.microsoft.com/wiki/contents/articles/21978.execute-ssis-2012-package-with-parameters-via-net.aspx?CommentPosted=true#commentmessage
Il existe également un article similaire sur http://domwritescode.com/2014/05/15/project-deployment-model-changes/
la source
Pour ajouter à la réponse @Craig Schwarze,
Voici quelques liens MSDN associés:
Chargement et exécution d'un package local par programme:
Chargement et exécution d'un package distant par programme
Capture d'événements à partir d'un package en cours d'exécution:
using System; using Microsoft.SqlServer.Dts.Runtime; namespace RunFromClientAppWithEventsCS { class MyEventListener : DefaultEvents { public override bool OnError(DtsObject source, int errorCode, string subComponent, string description, string helpFile, int helpContext, string idofInterfaceWithError) { // Add application-specific diagnostics here. Console.WriteLine("Error in {0}/{1} : {2}", source, subComponent, description); return false; } } class Program { static void Main(string[] args) { string pkgLocation; Package pkg; Application app; DTSExecResult pkgResults; MyEventListener eventListener = new MyEventListener(); pkgLocation = @"C:\Program Files\Microsoft SQL Server\100\Samples\Integration Services" + @"\Package Samples\CalculatedColumns Sample\CalculatedColumns\CalculatedColumns.dtsx"; app = new Application(); pkg = app.LoadPackage(pkgLocation, eventListener); pkgResults = pkg.Execute(null, null, eventListener, null, null); Console.WriteLine(pkgResults.ToString()); Console.ReadKey(); } } }
la source
Il existe donc une autre façon de le déclencher à partir de n'importe quelle langue. La meilleure façon que je pense, vous pouvez simplement créer un fichier batch qui appellera votre package .dtsx.
Ensuite, vous appelez le fichier de commandes à partir de n'importe quelle langue. Comme dans la plate-forme Windows, vous pouvez exécuter un fichier batch de n'importe où, je pense que ce sera l'approche la plus générique pour votre objectif. Aucune dépendance de code.
Ci-dessous un blog pour plus de détails.
https://www.mssqltips.com/sqlservertutorial/218/command-line-tool-to-execute-ssis-packages/
Bon codage .. :)
Merci, Ayan
la source
Vous pouvez utiliser cette fonction si vous avez une variable dans le SSIS.
Package pkg; Microsoft.SqlServer.Dts.Runtime.Application app; DTSExecResult pkgResults; Variables vars; app = new Microsoft.SqlServer.Dts.Runtime.Application(); pkg = app.LoadPackage(" Location of your SSIS package", null); vars = pkg.Variables; // your variables vars["somevariable1"].Value = "yourvariable1"; vars["somevariable2"].Value = "yourvariable2"; pkgResults = pkg.Execute(null, vars, null, null, null); if (pkgResults == DTSExecResult.Success) { Console.WriteLine("Package ran successfully"); } else { Console.WriteLine("Package failed"); }
la source