如何在SqlServer 2012中使用vs2010运行SSIS程序包?

6

设置

我有一个可以从Visual Studio运行的vs2010 SSIS包。我已将其部署到本地的2012服务器,并且也可以从SSMS执行该包。在SSMS中,我可以看到该包的位置如下:

\Integration Services Catalogs\SSISDB\DAT_Load\Projects\UploadSYS.dtsx

注意: vs2010不会给我提供将包部署到任何地方的选项,除了服务器,而且只能在Integration Services Catalogs中进行。一旦进入那里,MSDB数据库就没有在sysssispackages表中的记录。

以前,在SSMS中运行该包就足够了(右键单击并执行)。现在,我需要从C# Web应用程序中执行它。此外,我需要通过事件来捕获进度消息等。

努力

我能够确定如何设置事件捕获,并使自己达到了从代码中执行该包的应该能够的点:

    public DTSExecResult ExecutePackage(string packageName, HttpContextBase context)
    {
        string ppath = ConfigurationManager.AppSettings[packageName + "Package"];
        string pserv = ConfigurationManager.AppSettings[packageName + "Server"];
        string puser = ConfigurationManager.AppSettings[packageName + "User"];
        string ppass = ConfigurationManager.AppSettings[packageName + "Pwd"];
        _context = context;
        _pkgLocation = "";
        _app = new Application();
        _pkg = _app.LoadFromSqlServer(ppath, pserv, puser, ppass, _SSISEvents);
        _pkgResults = _pkg.Execute(_connections, _variables, _SSISEvents, _log, null);
        return _pkgResults;
    }

问题

我找不到这个软件包。当我执行LoadFromSqlServer语句时,出现以下错误:

无法找到文件夹“\ Integration Services Catalogs \ SSISDB \ DAT_Load \ Projects \ UploadSYS.dtsx”

对于路径的变化(变量=ppath),同样会发生相同的情况:

  • \Integration Services Catalogs\SSISDB\DAT_Load\Projects\UploadSYS.dtsx
  • \SSISDB\DAT_Load\Projects\UploadSYS.dtsx
  • \DAT_Load\Projects\UploadSYS.dtsx
  • 等等。

无法通过命令行或存储过程运行此操作。

那么,有谁能告诉我我错过了什么?应用程序对象需要初始化某些内容吗?这真的可能吗?


我觉得我缺少了什么。我设置了断点并运行了FolderExistsOnSqlServer命令,以查看实际存在哪些文件夹。惊喜!Integration Services目录下的文件夹不是FolderExistsOnSqlServer的位置。我只能假设所有DTS方法都是如此。现在,我该如何将我的包从ISC移到MSDB? - James Jensen
MSDB是包部署模型。SSISDB是项目部署模型。一旦部署,与它们交互的方式是不同的。最终,你的问题是:如何通过C#以编程方式运行项目部署模型中的SSIS包? - billinkc
1个回答

9

针对该问题,您可以参考设置SSIS数据库包路径SSIS组织以了解背景信息。

在SSIS 2012之前,如果将包部署到SQL Server,则它们存储在msdb中。跨版本使用的是相同的.NET API进行交互。

随着SSIS 2012的发布,我们有了两种不同的部署模型。包部署是“经典”模型,仍然得到全面支持。运行2005版的代码也适用于2012包部署模型项目。这是Microsoft.SqlServer.Dts.Runtime命名空间。

你的代码试图使用“包部署模型”API来加载使用“项目部署模型”构建的2012解决方案。这是Microsoft.SqlServer.Management.IntegrationServices命名空间,两者不兼容。
你有两个选择:将项目切换回包部署模型或更新你的代码。在第一个链接的问题中,我提供了在SSISDB目录中运行SSIS包的VB.NET实现。有一些方法可以运行.ispac文件,因为我在dtexec选项中看到了这个选项,但我没有看到具体的方法。这是VS/SSDT在本地运行包时使用的机制。

我明白了。我之前曾经遇到过Integration Services DLLs,但是对于它和Dts.Runtime api的区别感到困惑。而且,由于我的声望低于15,我无法给你的答案点赞,尽管它值得。 :) - James Jensen
没问题。如果这解决了你的问题,你可以点击勾号标记该问题已解决(你将获得2点声望)。否则,请告诉我还能做什么来改善这个答案。 - billinkc
所以,我已经成功将VB代码翻译成了我的C#应用程序。非常感谢@billinkc的帮助。不幸的是,我无法看到如何捕获从包中触发的事件。这里需要进行更多的研究。如果从IntegrationServices API中无法实现此功能,则需要返回到Dts API并创建一个已部署的包。尽管如此,您已经回答了我的问题,并为我提供了一条路径,如果必须忽略事件,则可以使用该路径。该死的SSIS... - James Jensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接