Ich habe ein SSIS-Paket, das ich schließlich auch Parameter übergeben möchte, diese Parameter werden von einer .NET-Anwendung kommen (VB oder C#), also war ich neugierig, ob jemand weiß, wie man das macht, oder besser noch eine Website mit hilfreiche Hinweise, wie es geht. Im Grunde möchte ich ein SSIS-Paket von .NET ausführen, das die SSIS-Paketparameter übergibt, die es in ihm verwenden kann. Zum Beispiel wird das SSIS-Paket den einfachen Dateiimport in eine SQL-Datenbank verwenden, aber der Pfad und der Name der Datei könnten der Parameter sein, der von der .Net-Anwendung übergeben wird.Wie führe ich ein SSIS-Paket von .NET aus?
Antwort
Hier ist, wie Variablen von Code im Paket setzen -
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");
}
Danke @Craig! "Dts" ist jetzt jedoch ab SQL Server 2008 veraltet. Wie können Sie dies ohne das Paket "Dts" tun? –
@IanCampbell Ich nehme an, Sie beziehen sich auf Microsoft.SqlServer.Dts.Runtime? Dts ist nur der Legacy-Name für SSIS - es ist nur die Namespace-Deklaration. Der obige Code wird zukünftig unterstützt. – Spikeh
@Spikeh - was mich verwirrt ist, dass Microsoft sagt, dass Dts veraltet ist und "durch SQL Server Integration Services ersetzt wurde": http://technet.microsoft.com/en-us/library/cc707786%28v=sql. 105% 29.aspx –
zu @Craig Schwarze Antwort hinzuzufügen
Hier sind einige relevante MSDN Links:
Loading and Running a Local Package Programmatically:
Loading and Running a Remote Package Programmatically
C apturing Events von einem Lauf Paket:
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();
}
}
}
Hier ist, wie Sie mit dem SSDB Katalog es, die mit 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;
}
Der Code ist eine leichte Anpassung von http://social.technet.microsoft.com/wiki/contents/articles/21978.execute-ssis-2012-package-with-parameters-via-net.aspx?CommentPosted=true#commentmessage
eingeführt wurdeEs gibt auch einen ähnlichen Artikel unter http://domwritescode.com/2014/05/15/project-deployment-model-changes/
Wo befindet sich die microsoft.sqlserver.management.integrationservices.dll? Ich habe SQL2014 installiert und kann es nicht finden eine Windows-Suche. –
Offenbar ist es nur in der GAC: [Microsoft.SqlServer.Management.IntegrationServices.dll Montageort] (http://muxtonmumbles.blogspot.com.au/2012/08/programmatical-executing-packages-in.html) –
Danke . Ich habs. Dieser Ort hat für mich funktioniert. –
Für zukünftige Leser: Bevor Sie die folgende Lösung verwenden, überprüfen Sie Ihre Lizenzierung. Ich glaube, das funktioniert nur auf Maschinen mit installiertem SSIS, nicht nur auf der DLL-Referenz. In einer Produktionsumgebung erfordert die Installation von SSIS, ohne die DB-Engine selbst zu installieren, normalerweise eine Lizenz. –
[Programm SSIS-Programm ausführen] (http://blogs.msdn.com/michen/archive/2007/03/22/running-ssis-package-programmatically.aspx) –
Kann jemand @ JohnSpiegel's Kommentar bestätigen? Funktioniert das nur in einer Produktionsumgebung, wenn SSIS installiert ist? –