C# 在SQL Server 2012上从SSIS目录执行SSIS包
使用SQL Server 2012的新SSIS目录,以前通过C#local从SQL Server执行SSIS包的方法(基本上下载包并在调用方机器上执行)不再有效:C# 在SQL Server 2012上从SSIS目录执行SSIS包,c#,ssis,sql-server-2012,C#,Ssis,Sql Server 2012,使用SQL Server 2012的新SSIS目录,以前通过C#local从SQL Server执行SSIS包的方法(基本上下载包并在调用方机器上执行)不再有效: Application app = new Application(); Package pkg = app.LoadFromSqlServer("\\FolderRoot", "myserver", null, null, null); pkg.Execute(); MSDN文章中讨论了这种方法 对于SQL Server 2012
Application app = new Application();
Package pkg = app.LoadFromSqlServer("\\FolderRoot", "myserver", null, null, null);
pkg.Execute();
MSDN文章中讨论了这种方法
对于SQL Server 2012,使用SSIS目录方法,执行SSIS包的新方法似乎是使用命名空间中的类。让我很困惑的是,微软并没有提供任何有用的文档来说明这种处理包执行的新方法。建议采用以下方法:
SqlConnection ssisConnection = new SqlConnection(@"Data Source=.\SQL2012;Initial Catalog=master;Integrated Security=SSPI;");
IntegrationServices ssisServer = new IntegrationServices(ssisConnection);
PackageInfo ssisPackage = ssisServer.Catalogs["SSISDB"].Folders["MasterChild"].Projects["MasterChildPackages"].Packages["master.dtsx"];
long executionIdentifier = ssisPackage.Execute(false, null, executionParameter);
但是,这不会在本地执行,而是在服务器上运行。我的问题是,对于远程SQL Server 2012上的SSIS目录,是否仍然可以从该远程服务器在我自己的计算机上本地执行包?定义“不工作”。正如我从文档中看到的,您给出的代码(适用于<2012年的代码)应该仍然适用于2012年,它没有标记为已弃用,或者类似的东西
请确保引用此dll,而不是旧的dll:
C:\ProgramFiles(x86)\Microsoft SQL Server\110\SDK\Assemblys\Microsoft.SqlServer.ManagedTs.dll
//编辑;现在看来你是对的:
也许这会让你走(ps我不知道这是否有效,但我看到了一些有用的方法,也许你可以让它工作):
我从未尝试过以编程方式从SSIDB执行包。但是,SSIDB中的包不仅仅是一个单独的包。这是一个项目的一部分。包必须在项目上下文中执行,而项目上下文只能通过SSIDB执行。没错,包需要在其项目上下文中执行。因此,真正的问题是如何在我的PC上本地执行整个远程部署的项目?使用Microsoft.SqlServer.Dts.Runtime;你尝试过这个名称空间吗..你想在c代码中执行它,对吗?@Govind是的,我想在c代码中执行它。该命名空间不适用于包存储在SSIS目录中的SQL server。您提供的代码在服务器上执行项目。这不是我想要实现的。请尝试使用相同的代码,但将projectBytes另存为yourFIle.ispac,然后尝试执行dtexec/Project yourFIle.ispac/package master.dtsx。如果它确实在本地执行,我会尝试使用APIMONITOR查看它调用的方法。如果这不能在本地执行,我认为SSIS包不能在本地执行,尽管我没有找到任何“证明”或反证明。实际上,您的代码看起来可能就是我需要的。我正在测试这个!这绝对是在本地运行项目。非常感谢你!
var projectBytes = ssisServer.Catalogs["SSISDB"]
.Folders["MasterChild"]
.Projects["MasterChildPackages"].GetProjectBytes();
// note that projectBytes is basically __URFILE__.ispac
using (var existingProject = Project.OpenProject(new MemoryStream(projectBytes)))
{
existingProject.PackageItems["master.dtsx"].Package.Execute(.... todo ....)
}